vars()与__dict__是否等价?为何类调用时is判断返回False?
为什么
vars(Person) is Person.__dict__返回False? 核心原因是:对于自定义类,vars(Person)和Person.__dict__返回的是内容相同但身份不同的mappingproxy对象,而is运算符判断的是对象的内存身份(是否为同一个对象),不是值是否相等。
详细解释:
vars(obj)的官方定义是返回对象的__dict__属性,但对于类对象来说,__dict__是一个特殊的描述符(descriptor),它返回的是mappingproxy类型的对象——这个类型的作用是保护类的属性不被直接修改(比如无法通过Person.__dict__['new_key'] = value给类添加属性)。- 虽然
vars(Person)和Person.__dict__包含的类属性完全一致(用==判断会返回True),但Python解释器在某些场景下,每次访问__dict__描述符或调用vars()时,会生成新的mappingproxy实例,导致两者的内存地址不同,is判断返回False。
代码验证:
class Person: def __init__(self, name, age): self.name = name self.age = age # 值相等,返回True print(vars(Person) == Person.__dict__) # 身份不等,返回False print(vars(Person) is Person.__dict__) # 两者类型一致,都是mappingproxy print(type(vars(Person))) # <class 'mappingproxy'> print(type(Person.__dict__)) # <class 'mappingproxy'>
注意点:
如果需要操作类的属性字典,可以用dict(vars(Person))将mappingproxy转换为普通字典,但不建议直接修改类的属性字典,应该使用标准的类属性赋值方式(比如Person.new_attr = 1)。
内容的提问来源于stack exchange,提问作者Anunad Singh
相关产品推荐
相关产品推荐

