Python参考

时间:2010-05-09 08:55:05

标签: 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

5 个答案:

答案 0 :(得分:9)

答案 1 :(得分:8)

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

答案 2 :(得分:4)

如果执行y = x,则y和x是对同一对象的引用。但是整数是不可变的,当你执行x + 1时,会创建新的整数:

>>> x = 1
>>> id(x)
135720760
>>> x += 1
>>> id(x)
135720748
>>> x -= 1
>>> id(x)
135720760

当你有一个可变对象(例如列表,你自己定义的类)时,只要y被改变就会改变x,因为它们指向一个对象。

答案 3 :(得分:0)

那是因为当你在python中有一个列表或一个元组时,你创建了一个对象的引用。 当你说y = x时,你用y引用同一个对象。 所以当你编辑x的对象时,用它来改变。

答案 4 :(得分:0)

如前所述,您所编写的代码将相同的对象分配给不同的名称,例如别名。 如果要将原始列表的副本分配给新变量(实际对象) 使用此解决方案:

>>> x=[1,2,3]
>>> y=x[:] #this makes a new list
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> x[0]=4
>>> x
[4, 2, 3]
>>> y
[1, 2, 3]