Python值传递与引用传递疑问:重赋值引用变量为何不修改原变量
Python变量传递:不是按值/引用,是按对象引用传递
首先得纠正一个常见误区:Python里既不是严格的按值传递,也不是按引用传递,而是按对象引用传递(也叫按共享传递),核心区别在于你操作的是「对象本身」还是「变量的引用指向」。
第一个示例:修改可变对象的内部元素
你的第一段代码里,arg是一个列表(可变对象):
arg = [1,2,3] class MyClass: def func(self, arg): self.val = arg self.val[0] = -22 m = MyClass() m.func(arg) print(arg) # 输出 [-22, 2, 3]
self.val = arg这一步是让self.val和arg指向同一个列表对象,相当于两个人同时盯着同一个盒子。self.val[0] = -22是直接修改这个列表对象内部的元素(也就是修改盒子里的东西),因为arg也指向这个盒子,所以打印arg时能看到变化。
第二个示例:改变变量的引用指向
第二段代码里,你做的是重新赋值:
arg = [1,2,3] class MyClass: def func(self, arg): self.val = arg self.val = -22 m = MyClass() m.func(arg) print(arg) # 输出 [1, 2, 3]
- 一开始
self.val = arg还是让self.val指向原来的列表对象,但紧接着self.val = -22是把self.val的引用改成了一个新的整数对象(-22是不可变对象)。 - 这时候只是
self.val换了个目标,原来的列表对象完全没被修改,arg依然指向原来的列表,所以输出不变。
关键总结
- 对于可变对象(列表、字典、集合等):如果操作是修改对象内部的内容(比如列表的元素、字典的键值对),所有指向该对象的变量都会看到变化。
- 对于任何对象:如果直接给变量赋值(比如
x = 10、x = []),只是改变了变量的引用指向,和原来的对象无关,其他指向原对象的变量不受影响。
内容的提问来源于stack exchange,提问作者24n8
相关产品推荐
相关产品推荐

