Python参考

hek*_*ran 15 python immutability

有人可以解释为什么带有整数的示例会导致x和y的值不同,而列表中的示例会导致x和y成为同一个对象吗?

x = 42
y = x
x = x + 1
print x # 43
print y # 42

x = [ 1, 2, 3 ]
y = x
x[0] = 4
print x # [4, 2, 3]
print y # [4, 2, 3]
x is y # True
Run Code Online (Sandbox Code Playgroud)

Max*_*keh 8

因为整数是不可变的,而列表是可变的.您可以从语法中看到.在x = x + 1你实际上是为了分配一个新值x(它在LHS上是唯一的).在x[0] = 4,你在列表上调用索引运算符并给它一个参数 - 它实际上相当于x.__setitem__(0, 4),这显然改变了原始对象,而不是创建一个新对象.

  • 所有"变量"都是参考.不同之处在于您无法更改不可变对象.一旦创建它们,它们永远不会改变 - 任何尝试的改变都将创建一个新对象. (3认同)
  • 声明"为x分配新值"是不诚实的,可能会造成混淆.发生的事情是对新对象的引用(x + 1的结果)绑定到名称x.Python没有lvalue/rvalue的概念,因为所有内容都被引用 - 所以区别很重要. (2认同)