我想我理解 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]