3

大家好,我知道这段代码的作用:

1.] 我的第一个问题

x = 4 
y = x

但是这个呢。为什么即使在这种情况下也有相同的地址?

x = 4
y = 4
id(x)
12345678
id(y)
12345678

2.] 我的第二个问题

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


x = [1, 2, 3]
y = x
x[0] = 4
print x # Prints [4, 2, 3]
print y # Prints [4, 2, 3]

但是为什么在 list 的情况下,两个x&都y被 command 一起变异了x[0] = 4
在这种行为中,列表有什么不同?
是什么让他们有这样的行为?
最重要的是,这种行为有什么好处?
为什么不能列表、变量、元组具有彼此的所有属性?

4

2 回答 2

8
  1. 小整数缓存在 CPython中,这就是它们的 id 相同的原因。
  2. 整数是不可变的,因此修改(即分配给一个新对象)一个不会影响其他引用。
  3. 列表是可变的,因此修改对可变对象的任何引用(就地修改)也会影响其他引用。
  4. 小字符串也可以有相同的 id

整数示例:

>>> x = 100
>>> y = x
>>> id(x),id(y)
(165193204, 165193204)
>>> x += 1
>>> id(x), id(y)    #`x` now points to a new object, `y` still points to the old object
(165193192, 165193204)
于 2013-08-30T06:21:03.083 回答
2

您的第一个问题可以通过内存优化来解决。如果您进一步挖掘,例如:

x = 4
y = 4
# Both (may) have the same id
x += 1
# id of x and y will now be different

二是引用语义。由于 Python 中的几乎所有内容都是一个参考,因此设置x = y只是说指向与指向y相同的事物x。如果你真的想要一个完全独立的副本,你需要这样说:

x = [1, 2, 3, 4]
y = x[:]
x[0] = 5
y
>>> [1, 2, 3, 4]
于 2013-08-30T06:23:56.987 回答