1. 变量是什么? #
在 Python 中,变量是贴在对象上的标签 ,不是装数据的盒子。
赋值是把标签指向某个对象。
a = 10
a = "hello"
2. 命名规则 #
规则
说明
字符
字母、数字、下划线
开头
不能以数字开头
关键字
不能用 if、class 等保留字
项目里遵循 PEP 8 :变量用 snake_case,见名知意。
user_name = "Alice"
max_retry_count = 3
3. 常用赋值 #
name, age = "Bob" , 25
x, y = 10 , 20
x, y = y, x3.1 链式赋值的陷阱 #
可变对象(列表、字典)用 a = b = [] 会共享同一个对象,改一个会影响另一个。
a = b = []
a.append(1 )
print (b)
a, b = [], []4. is 与 == #
运算符
比较的是
==
值是否相等
is
是否是同一个对象 (同一内存)
a = [1 , 2 , 3 ]
b = [1 , 2 , 3 ]
c = a
print (a == b)
print (a is b)
print (a is c)
value = None
if value is None :
print ("value 是 None" )5. 可变对象 vs 不可变对象 #
不可变对象赋值时生成新对象;可变对象可原地修改,多个变量可能共享同一对象。
类型
分类
修改时
int、float、str、tuple
不可变
生成新对象
list、dict、set
可变
原地修改,id 不变
s = "hi"
s += "!"
print (s)
lst = [1 , 2 , 3 ]
lst.append(4 )
print (lst)
lst2 = lst
lst.append(5 )
print (lst2) 6. 浅拷贝和深拷贝 #
浅拷贝 只复制最外层,嵌套对象仍可能共享。
深拷贝 递归复制所有层级,副本完全独立。
import copy
list1 = [1 , 2 , [3 , 4 ]]
shallow_copy = copy.copy(list1)
print ('原始list1:' , list1)
print ('浅拷贝shallow_copy:' , shallow_copy)
list1[2 ][0 ] = 99
print ('修改list1[2][0]为99后' )
print ('list1:' , list1)
print ('shallow_copy:' , shallow_copy)
list2 = [1 , 2 , [3 , 4 ]]
deep_copy = copy.deepcopy(list2)
print ('原始list2:' , list2)
print ('深拷贝deep_copy:' , deep_copy)
list2[2 ][0 ] = 88
print ('修改list2[2][0]为88后' )
print ('list2:' , list2)
print ('deep_copy:' , deep_copy) 7. 函数中的常见陷阱 #
7.1 传递可变对象 #
函数收到的是对象引用。
在函数内修改 列表/字典会影响外部,重新赋值 则不会。
def add_item (items ):
"""
向传入的列表中添加一个元素99。
注意:此操作会修改原列表。
"""
items.append(99 )
def reset (items ):
"""
清空传入的列表。
注意:此操作会修改原列表,使其为空列表。
"""
items.clear()
my_list = [1 , 2 , 3 ]
print ("原列表:" , my_list)
add_item(my_list)
print ("添加99后:" , my_list)
reset(my_list)
print ("重置后:" , my_list)7.2 可变默认参数(高频 bug) #
def add (x, lst=[] ):
lst.append(x)
return lst
print (add(1 ))
print (add(2 ))
def add_fixed (x, lst=None ):
if lst is None :
lst = []
lst.append(x)
return lst
print (add_fixed(1 ))
print (add_fixed(2 )) 8. 项目开发要点 #
变量是引用 :赋值、传参传递的是对象引用,不是拷贝(除非显式 copy)。
判断空值用 is None :不要用 == None。
比较内容用 == :不要用 is 比较字符串、列表的值(is 只用于 None、同一对象)。
共享列表要小心 :配置、缓存等传给多处时,明确是共享还是 .copy() 副本。
默认参数不要用 [] 或 {} :用 None 再在函数内创建。
嵌套数据要深拷贝 :copy.deepcopy(),浅拷贝只复制最外层。