指针在列表理解中都是一样的,即使它们不应该

pointers all the same in list comprehension even though they shouldn't

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

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

但是,当我执行这段代码时(在列表理解中创建对象)

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]

哪个更糟糕(我猜?),因为它甚至不是具有相同属性的对象。指针和属性之间的区别用两个完全相同的对象来举例说明,这两个对象具有相同的属性但是是不同的对象,因此具有不同的指针。

其实纯属巧合,他们有相同的id,Python通过引用计数来决定是否销毁一个对象。你没有保存每个 A(n) 的引用,这导致它在你获得它的 id 后立即被销毁,所以下一个 A(n) 将使用与前一个相同的内存 space。

>>> [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]