为什么两个__dict__之间的比较是假的?



我有这样一个类:

class Person:
def __init__(self):
self.name = "amir"
self.age = 22

我像这样比较两个__dict__:

n1 = Person()
n2 = Person()
print(n1.__dict__.items())   #dict_items([('name', 'amir'), ('age', 22)])
print(n2.__dict__.items())   #dict_items([('name', 'amir'), ('age', 22)])
print(hex(id(n1.__dict__.items())))   #0x7fc83425f310
print(hex(id(n2.__dict__.items())))   #0x7fc83425f310
print(n1.__dict__.items() is n2.__dict__.items())   #False
print(n1.__dict__["name"] is n2.__dict__["name"])   #True

为什么n1.__dict__.items() is n2.__dict__.items()的结果是False?

您没有比较字典是否相同,显然它们不是:当您在另一个Person实例中更改此属性时,您不会希望或期望第一个Personname改变。

发生的事情是items()返回一个副本,然后超出作用域。当你再次调用它时,你可能会也可能不会得到另一个副本,它恰好是在相同的内存地址上创建的。(实验上,我似乎得到了一个不同的地址,也许是因为我对你的代码做了一些小的改变,在这里:https://ideone.com/AoM14r)

你应该能够通过确保第一个结果没有

超出作用域来轻松地证明这一点,例如通过将其存储在变量中。正确的测试是n1.__dict__ is n2.__dict__,它总是False

具有相同值的单个dict成员有时会引用相同的对象,这是某些Python实现的优化。例如,小整数只分配一次,然后具有相同值的新变量只是对该值的引用。当变量的值改变时,引用被改变为指向不同的内存位置。同样的事情似乎也发生在两个相同的names上。

最新更新