Python赋值,什么时候传引用?
Python 里所有赋值,全都是「传引用」(地址引用),没有传统意义上的拷贝赋值。
区别只在:不可变对象看上去像值传递,可变对象明显是引用共享。
1. 先分两类对象
不可变对象(值不会改)
int、float、str、bool、tuple可变对象(内容能原地改)
list、dict、set、自定义对象2. 赋值本质(永远一样)
a = [1,2,3]
b = a
不是把列表复制一份给 b
而是:a 和 b 指向同一个内存地址的同一个对象
👉 这就是传引用
3. 什么时候能明显看出「传引用」
只要是可变对象赋值、传参、函数返回,都是共享引用:
lst1 = [1,2]
lst2 = lst1 # 引用传递,指向同一个列表
lst2.append(3)
print(lst1) # [1,2,3] 跟着变了!
原因:lst1、lst2 是同一个内存地址
4. 为什么不可变对象好像不是传引用?
a = 10
b = a
b = 20
print(a) # 10 没变
不是没传引用,而是:
不可变对象不能原地修改,重新赋值只是让
b 指向了新地址,原来的 a 不受影响。5. 函数传参也是一样规则
- 传可变对象:函数内修改会影响外部(引用共享)
- 传不可变对象:函数内重新赋值不影响外部
def func(x):
x.append(99)
lst = [1,2]
func(lst)
print(lst) # [1,2,99] 外部被改了,就是引用传递
6. 快速记忆口诀
- Python 赋值全是引用传递,无值传递
- list/dict/set/ 自定义类:赋值、传参都共享地址,改一个全变
- int/str/tuple:看似不影响,只因不可变,重新赋值就换地址
- 想断开引用、独立修改:用
.copy()、切片[:]、deepcopy

浙公网安备 33010602011771号