You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:35:04