大家好,欢迎来到 100 天精通 Python 打卡第 9 天!
前面我们已经学会了基础变量、高级变量、函数、综合项目,今天进入变量底层逻辑。
这一章是新手最容易踩坑的地方,也是面试高频考点,彻底搞懂后,写代码会少很多莫名其妙的 Bug。
一、变量本质:不是盒子,而是标签
在 Python 中:
- 变量不是装数据的盒子
- 变量是贴在数据上的标签(引用)
并不是把 10 复制给 b,而是让 b 也指向同一个数据对象。
二、可变类型 vs 不可变类型
1. 不可变类型
创建后不能修改原值,修改会生成新对象
- int / float / str / bool / tuple
a = "hello"a = "world" # 不是修改原字符串,而是新建字符串
2. 可变类型
可以直接在原对象上修改
lst = [1,2,3]lst.append(4) # 直接修改原列表
三、赋值、浅拷贝、深拷贝(超级重点)
1. 直接赋值:只是贴标签
a = [1,2,3]b = ab.append(4)print(a) # [1,2,3,4] a也变了!
因为 a 和 b 指向同一个列表。
2. 浅拷贝 copy ()
只拷贝第一层,嵌套的可变类型仍然共用
a = [1,2,[3,4]]b = a.copy()b[0] = 999print(a) # [1,2,[3,4]] 第一层不受影响b[2].append(5)print(a) # [1,2,[3,4,5]] 嵌套列表被改了
3. 深拷贝 deepcopy
完全独立复制,彻底无关
import copya = [1,2,[3,4]]b = copy.deepcopy(a)b[2].append(5)print(a) # [1,2,[3,4]] 完全不变
四、变量作用域
1. 局部作用域
函数内部定义,只能内部用
def func(): x = 10 # 局部变量func()# print(x) 报错
2. 全局作用域
文件顶层定义,整个文件可用
x = 100def func(): print(x)
五、global 关键字
在函数内部修改全局变量必须声明 global
count = 0def add(): global count count += 1add()print(count) # 1
六、nonlocal 关键字
用于嵌套函数中修改外层函数变量(闭包常用)
def outer(): num = 10 def inner(): nonlocal num num += 1 inner() print(num) # 11
七、函数参数传递规则
- 不可变类型: 类似值传递,函数内改不影响外面
- 可变类型: 类似引用传递,函数内改会影响外面
def func(lst): lst.append(4)a = [1,2,3]func(a)print(a) # [1,2,3,4]
八、高级小知识点
1. 身份判断 is vs ==
== 比较值是否相等is 比较内存地址是否同一个对象
a = [1,2]b = [1,2]print(a == b) # Trueprint(a is b) # False
2. id () 查看内存地址
3. 小整数池
Python 对 -5 ~ 256 整数做了缓存,共用对象:
a = 10b = 10print(a is b) # True
九、今日高频易错点总结
- 列表赋值会互相影响,要用 copy /deepcopy
is 判断同一个对象,== 判断值相同