python 字典属性和项

0 投票
1 回答
578 浏览
提问于 2025-04-18 08:13

在下面的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

因为在这两种情况下,你存储的是同一个对象。所以,当你去取这个对象的时候,不管你是用哪种方式去取,得到的都是同一个对象。还有什么其他的可能呢?

撰写回答