python - pointers 在 list comprehension 中都是一样的,即使它们不应该

我想我理解 pointers,这是一个显示正常行为的示例:

class A:
  def __init__(self, n):
      self.n = n
a = A(1)
b = A(1)
print(id(a))
print(id(b))

输出是:

001 | 140441581640704
002 | 140441581640608

但是,当我执行此代码时(在 list comprehension 中创建对象)

class A:
  def __init__(self, n):
      self.n = n

a = [id(A(n)) for n in range(5)]

print(a)

我得到这个输出:

[140270531148816, 140270531148816, 140270531148816, 140270531148816, 140270531148816]

哪个更糟(我猜?)因为它甚至不是具有相同属性的对象。 pointers 和属性之间的区别以两个完全相同的对象为例,这些对象具有相同的属性,但是是不同的对象,因此具有不同的 pointers。

回答1

其实它们的id相同纯属巧合,Python通过引用计数来判断是否销毁一个对象。您不保存每个 A(n) 的引用,这会导致它在您获得其 id 后立即被销毁,因此下一个 A(n) 将使用与前一个相同的内存空间。

>>> [id(A(n)) for n in range(5)]
[2014694650160, 2014694650160, 2014694650160, 2014694650160, 2014694650160]
>>> [id(a) for a in [A(n) for n in range(5)]]
[2014694650208, 2014694637632, 2014694649440, 2014694653808, 2014694649536]