vars() 返回对象的 dict__,仅适用于拥有 __dict 的对象(如自定义类实例、模块、函数),不支持内置类型;其与 dir() 的核心区别在于:vars() 仅返回可变属性字典,而 dir() 返回所有可访问名称列表。

vars() 返回的是对象的 __dict__,不是所有对象都支持
直接对内置类型(比如 list、int、str)调用 vars() 会报错:TypeError: vars() argument must have __dict__ attribute。它只适用于拥有 __dict__ 的自定义类实例、模块、函数等。检查一个对象是否可用 vars(),最简单的方法是先看有没有 __dict__ 属性:hasattr(obj, '__dict__')。
常见误用场景:想用 vars(my_list) 查看列表内容——这不行,得用 dir() 或直接打印。
vars() 和 dir() 的关键区别在哪
vars() 只返回对象的可变属性字典(即 __dict__),而 dir() 返回所有可访问名称(包括方法、继承来的属性、特殊方法等)。对一个类实例来说,vars(obj) 是个 dict,能直接遍历或修改;dir(obj) 是个 list,只读,不能改值。
- 想动态修改属性?用
vars(obj)['key'] = value或setattr(obj, 'key', value) - 只想快速浏览有哪些字段名?
list(vars(obj).keys())比dir(obj)更干净,过滤掉了方法和双下划线属性 - 调试时发现
vars(obj)是空字典?可能是用了__slots__,这时对象没有__dict__,vars()就失效了
用 vars() 查看模块变量时要注意作用域
在模块顶层调用 vars()(不传参)等价于 globals(),返回当前模块的全局符号表。但它不会自动包含导入的模块名,除非你显式赋值过,比如 import json 后,json 这个名字在 globals() 里,但 vars() 不会“展开” json 的内容。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
如果想看某个导入模块的公开属性,得传入模块对象:vars(json),这样才得到 json 模块自己的 __dict__。
- 别写
vars(import json)——语法错误,import不是表达式 - 想查标准库模块有哪些常量或函数?
list(vars(os).keys())比翻文档快,但注意有些是动态生成的(比如os.path),不一定全在__dict__里 - 在函数内部调用无参
vars(),返回的是局部作用域的locals(),但不建议依赖它做逻辑判断,因为 CPython 可能优化掉未使用的局部变量
vars() 修改属性的副作用容易被忽略
vars(obj) 返回的是原 __dict__ 的引用,不是副本。所以直接修改这个字典,等于直接改对象属性:
class Person:
def __init__(self, name):
self.name = name
<p>p = Person("Alice")
d = vars(p)
d["age"] = 30
print(p.age) # 输出 30</p>
这种写法隐蔽性强,容易绕过 property 或 __setattr__ 钩子。如果类定义了 @property 或重写了 __setattr__,用 vars(obj)[key] = val 会跳过这些逻辑,导致状态不一致。
- 安全做法:优先用
setattr(obj, key, val),它会触发描述符和钩子 - 调试时临时打补丁可以,但别放进生产逻辑
- 对 frozen dataclass 或使用
__slots__的类,vars()返回空或报错,这时候强行写入会失败
真正要用 vars() 的时候,通常是在调试阶段快速 inspect 对象状态,或者写通用序列化/反射工具。它的简洁性有代价:依赖 <strong>dict</strong> 存在,且绕过 Python 的属性访问协议。用之前,先确认对象没用 <strong>slots</strong>、没禁用 <strong>dict</strong>、也没重写 <strong>getattribute</strong>。否则看起来什么都没发生,其实根本没生效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










