以下是 Python 变量的详细解析:
1. 变量的本质
Python 变量本质上是一个 指向对象的引用(类似标签),而不是存储数据的容器。
- 变量赋值
a = 10
时,Python 会创建一个整数对象10
,然后让变量a
指向这个对象。 - 变量本身没有固定类型,类型属于对象(动态类型特性)。
a = 10 # a 指向整数对象 10
a = "hello" # 现在 a 指向字符串对象 "hello"(合法)
2. 变量的命名规则
- 由字母、数字、下划线组成,不能以数字开头。
- 区分大小写(
var
和Var
不同)。 - 不能使用关键字(如
if
,for
,class
)。 - 建议使用小写字母和下划线的组合(如
user_name
)。
合法示例:
name = "Alice"
_age = 25
value2 = 3.14
非法示例:
2var = 10 # 以数字开头
class = "Python" # 使用关键字
3. 变量类型
Python 是动态类型语言,变量的类型由指向的对象决定。常见类型:
- 基本类型:
int
,float
,str
,bool
,NoneType
- 容器类型:
list
,tuple
,dict
,set
a = 5 # int
b = 3.14 # float
c = "Hello" # str
d = True # bool
e = [1, 2, 3] # list
f = {"key": "value"} # dict
4. 变量作用域
- 局部变量:在函数内部定义,仅在函数内有效。
- 全局变量:在函数外部定义,全局有效。函数内修改全局变量需用
global
关键字。 - 非局部变量:在嵌套函数中使用外层变量时,需用
nonlocal
关键字。
x = 10 # 全局变量def func():global xx = 20 # 修改全局变量y = 5 # 局部变量func()
print(x) # 输出 20
5. 可变对象 vs 不可变对象
- 不可变对象:值不可修改(如
int
,float
,str
,tuple
)。修改变量会创建新对象。 - 可变对象:值可修改(如
list
,dict
,set
)。修改时对象本身变化。
# 不可变示例
a = 10
print(id(a)) # 输出地址 1
a = 20 # 创建新对象
print(id(a)) # 地址改变# 可变示例
b = [1, 2]
print(id(b)) # 地址 2
b.append(3) # 修改原对象
print(id(b)) # 地址不变
6. 变量赋值与内存管理
- 赋值操作:变量间的赋值是传递引用(浅拷贝)。
- 深拷贝:使用
copy.deepcopy()
创建完全独立的对象。
list1 = [1, 2, 3]
list2 = list1 # list2 和 list1 指向同一对象
list2.append(4)
print(list1) # 输出 [1, 2, 3, 4]import copy
list3 = copy.deepcopy(list1) # 深拷贝
list3.append(5)
print(list1) # 输出 [1, 2, 3, 4](原对象未变)
print(list3) #输出[1, 2, 3, 4, 5]
7. 变量与函数参数
- 不可变对象参数:函数内修改不会影响外部变量。
- 可变对象参数:函数内修改会影响外部变量。
def modify(num, lst):num += 1 # 不影响外部变量lst.append(4) # 修改原对象a = 10
b = [1, 2, 3]
modify(a, b)
print(a) # 输出 10
print(b) # 输出 [1, 2, 3, 4]
8. 特殊变量
_
:临时变量或忽略值(如for _ in range(5)
)。__name__
:模块的内置属性,用于判断是否为主程序入口。
9. 常见问题
- 变量未定义:使用未赋值的变量会触发
NameError
。 - 类型错误:对变量执行不兼容操作(如
str + int
)会触发TypeError
。 - 意外修改可变对象:多个变量引用同一对象时需谨慎。
总结
Python 变量的核心特点:
- 动态类型:变量类型由对象决定。
- 引用语义:变量是对象的标签。
- 灵活但需注意可变对象和赋值逻辑。
掌握这些概念能帮助你写出更高效、健壮的代码!