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. 快速记忆口诀

 
  1. Python 赋值全是引用传递,无值传递
  2. list/dict/set/ 自定义类:赋值、传参都共享地址,改一个全变
  3. int/str/tuple:看似不影响,只因不可变,重新赋值就换地址
  4. 想断开引用、独立修改:用 .copy()、切片 [:]deepcopy

 

posted @ 2026-04-26 10:51  emanlee  阅读(1)  评论(0)    收藏  举报