有人可以解释为什么带有整数的示例会产生不同的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
答案 0 :(得分:9)
我读过的最好的解释是: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables
答案 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]