You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:15:26