我有这样一个类:
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
实例中更改此属性时,您不会希望或期望第一个Person
的name
改变。
发生的事情是items()
返回一个副本,然后超出作用域。当你再次调用它时,你可能会也可能不会得到另一个副本,它恰好是在相同的内存地址上创建的。(实验上,我似乎得到了一个不同的地址,也许是因为我对你的代码做了一些小的改变,在这里:https://ideone.com/AoM14r)
超出作用域来轻松地证明这一点,例如通过将其存储在变量中。正确的测试是n1.__dict__ is n2.__dict__
,它总是False
。
dict
成员有时会引用相同的对象,这是某些Python实现的优化。例如,小整数只分配一次,然后具有相同值的新变量只是对该值的引用。当变量的值改变时,引用被改变为指向不同的内存位置。同样的事情似乎也发生在两个相同的name
s上。