python 字典属性和项
在下面的Python代码中,dict.setitem和setattr有什么区别呢?
当我把setattr这一行注释掉时,我就不能使用g.abcd了。但是如果我保留setattr这一行,我就可以同时使用g.abcd和g['abcd'],而且它们返回的值都是300。
id(g.abcd)和id(g['abcd'])
返回的是同一个值。
我有点困惑:dict.setitem应该是把一个键值对放进哈希表里,而setattr应该是给类添加一个额外的属性(或者字段,或者成员)。所以它们看起来是不同的东西。因此,我觉得去掉setattr应该会导致g.abcd无法使用。
但是我不明白为什么id()对g.abcd和g['abcd']返回的是同一个值,它们为什么指向内存中的同一个位置呢?
谢谢!
class T(dict):
def __setitem__(self, key, value):
dict.__setitem__(self, key, value) # <------- dict.setitem
setattr(self, key, value) # <-------- setattr
g=T()
g.__setitem__('abcd', 300)
>>> id(g.abcd)
147169236
>>> id(g['abcd'])
147169236
1 个回答
2
因为在这两种情况下,你存储的是同一个对象。所以,当你去取这个对象的时候,不管你是用哪种方式去取,得到的都是同一个对象。还有什么其他的可能呢?