Python 引用

15 投票
4 回答
7140 浏览
提问于 2025-04-15 22:30

有人能解释一下为什么整数的例子中,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

4 个回答

0

这是因为在Python中,当你创建一个列表或元组时,其实是创建了一个指向某个对象的引用。
当你写 y = x 的时候,y 和 x 指向的是同一个对象。
所以当你修改 x 所指向的对象时,y 也会跟着变化。

4

如果你写 y = x,那么y和x其实是指向同一个东西。但是整数是不可改变的,当你写 x + 1 的时候,会创建一个新的整数:

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

当你有一个可改变的对象(比如列表,或者你自己定义的类)时,只要y发生变化,x也会跟着变化,因为它们指向的是同一个对象。

8

因为整数是不可变的,而列表是可变的。从语法上你就能看出来。在 x = x + 1 这行代码中,你实际上是给 x 赋了一个新值(它在等号左边是单独的)。而在 x[0] = 4 这行中,你是在对列表使用索引操作,并给它一个参数——这实际上等同于 x.__setitem__(0, 4),很明显这是在改变原来的对象,而不是创建一个新的对象。

撰写回答