Python变量

一、变量的定义

什么是变量:变量是用于存储数据的容器,可以通过变量名来引用存储的值,直白一点就是变量代表了一个值,我们可以通过变量存储和获取值。

基本特点

  • 不需要显示声明类型,编译器会通过赋值进行类型推断
  • 同一个变量名在声明以后,可以被赋值不同类型的值

命名规则

  • 变量名只能包含:字母(a-z, A-Z)、数字(0-9)、下划线(_)
  • 首字母只能以字母或下划线开头,不能以数字开头
  • 区分大小写 nameNAME表示不同的变量
  • 不能使用Python关键字,可以通过使用 keyword.kwlist 获取当前版本Python的保留关键字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ✅ 允许的
name = "张三"
age_1 = 25
_user_count = 100
variable = 10 # 字母开头
_variable = 20 # 下划线开头
var123 = 30 # 字母开头,包含数字

# ❌ 不允许的
# my-name = "张三" # 不允许连字符
# my.name = "李四" # 不允许点号
# my name = "王五" # 不允许空格
# name@email = "test" # 不允许@符号
# $price = 100 # 不允许$符号
123var = 10 # 数字开头
1variable = 20 # 数字开头
123 = "test" # 纯数字也不行

建议的命名

类型 命名约定 示例
变量 snake_case(小写下划线) student_name, total_score
函数 snake_case(小写下划线) get_user_info(), calculate_total()
类名 PascalCase(大驼峰) StudentInfo, DataProcessor
常量 UPPER_CASE(全大写) MAX_SIZE, DEFAULT_TIMEOUT
模块 snake_case(小写下划线) my_module.py
包名 snake_case(全小写) my_package/

二、局部变量与全局变量

1、局部变量

定义位置:定义在函数内部的变量

作用域:只在定义它的函数内部生效

生命周期:函数调用时创建,函数结束时销毁

访问权限:只能在函数内部访问

1
2
3
4
5
6
7
def greet():
msg = "Hello Python!"
print(msg) # 这里能访问 msg

greet()
print(msg) # 报错:msg 在这里不存在

2、全局变量

定义位置:函数外部,模块顶层

作用域:在整个模块中有效

生命周期:程序运行时创建,程序结束时销毁

访问权限:可以在任何地方访问

1
2
3
4
5
6
7
8
x = 10  # 全局变量

def show():
print(x) # 在函数内部访问全局变量

show()
print(x) # 同样能访问

2.1 同名遮蔽(Shadowing)

如果全局有一个变量 a,函数里也定义了 a,局部变量 不会修改 全局变量,仅在函数内遮蔽它

1
2
3
4
5
6
7
8
9
a = 10

def f():
a = 99 # 局部变量,函数内部定义的局部变量 a 会遮蔽全局变量 a
print(a)

f() # 输出 99
print(a) # 仍然是 10

2.2 全局变量的修改

对全局变量的修改,需要借助关键字 global 完成,如果在修改全局变量时没有使用global 会发生错误。

语法:

1
2
global 变量名
# 赋值操作

错误示例:

1
2
3
4
5
6
x = 5

def f():
x = x + 1 # 会出错

f()

报错:

1
UnboundLocalError: cannot access local variable 'x' where it is not associated with a value

正确示例:

1
2
3
4
5
6
7
8
9
x = 5

def inc():
global x
x += 1

inc()
print(x) # 输出6

全局变量的滥用容易导致以下问题:

  • 增加代码耦合度

  • 增加非预期状态改变的风险

  • 让调试变难

三、常量

常量:一种特殊的变量,在程序整个生命周期中值不会发生改变,例如:数学的 π 。不过,Python 语言无法像Java等语言一样,通过constfinal关键字来声明变量为常量,限制代码对变量的修改。

命名风格:全大写字母 + 下划线,以此种方式声明变量预期是一个常量,不应该被修改

常量的访问和变量是相同的,可以直接访问,只是声明为常量以后,不应该去修改它

1
2
3
PI = 3.14159
MAX_RETRIES = 5
BASE_URL = "https://api.example.com"