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



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

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)将使用与前一个相同的内存空间。

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

相关内容

最新更新