Python 四大内置函数全景对比

发布时间:2026/7/9 3:29:34
Python 四大内置函数全景对比 一、核心速查表函数返回类型本质含义是否有值主要用途常见坑点vars(obj)dictobj.__dict__✅ 有值查看/修改对象的实例属性仅限有__dict__的对象dir(obj)list[str]对象的所有属性名❌ 无值探索对象“有什么”不包含值顺序无意义locals()dict当前局部作用域变量表✅ 有值查看当前函数/模块的局部变量函数内修改不一定生效globals()dict当前全局作用域变量表✅ 有值查看/修改全局变量模块级别才是真正的全局二、逐个深度拆解1️⃣vars()——「对象的属性字典」✅ 核心定义vars(obj)obj.__dict__返回对象的可写属性字典✅ 适用对象自定义类的实例类本身模块❌ 不适用对象vars(1)vars(abc)vars([1,2])原因内置类型没有__dict__✅ 经典示例classPerson:def__init__(self,name):self.namename pPerson(Alice)print(vars(p))# {name: Alice}print(p.__dict__)# {name: Alice}⚠️ 重要特性dvars(p)d[age]18print(p.age)# 18原地修改✅返回的是同一个 dict不是拷贝2️⃣dir()——「对象的属性清单」✅ 核心定义返回一个字符串列表列出对象“能访问到的所有属性名”✅ 特点包含实例属性类属性继承的方法魔术方法__xxx__不包含属性值✅ 示例classA:x1deffoo(self):passaA()print(dir(a))# [__class__, __delattr__, ..., foo, x]✅ 调试神器print([xforxindir(obj)ifnotx.startswith(__)])⚠️ 注意dir(int)# 能看到 int 的所有方法vars(int)# ✅ 有类属性vars(1)# ❌ 报错✅dir()永远不报错3️⃣locals()——「当前局部作用域」✅ 核心定义返回当前作用域中所有“局部变量”组成的字典✅ 不同场景的行为① 在模块顶层a1b2print(locals()isglobals())# True② 在函数内部deffoo():x10y20print(locals())foo()# {x: 10, y: 20}⚠️ 超级重要面试高频deffoo():x10locals()[x]99print(x)# 10不会变✅函数中的locals()是只读快照❌ 修改不会影响真实局部变量4️⃣globals()——「当前全局作用域」✅ 核心定义返回当前模块命名空间的字典✅ 特点包含全局变量导入的模块定义的类和函数可写✅ 示例x100defbar():globals()[x]999bar()print(x)# 999 ✅✅ 动态创建全局变量慎用globals()[new_var]123print(new_var)# 123三、四者关系一张图逻辑视角作用域 / 对象 ├── 模块 │ ├── globals() → 模块级变量 │ ├── locals() → 同 globals() │ ├── vars() → 模块.__dict__ │ └── dir() → 模块所有属性 │ ├── 函数 │ ├── globals() → 模块级 │ ├── locals() → 函数局部变量只读 │ └── dir() → 当前作用域可见名字 │ └── 对象 ├── vars(obj) → 实例属性字典 └── dir(obj) → 所有可访问属性名四、一句话记忆法vars 属性字典有值dir 属性名单有名locals 眼前变量局部globals 文件级变量全局五、常见面试 实战问答Q1vars()和dir()哪个更常用✅调试用vars()探索用dir()Q2为什么函数里改locals()没用✅ 因为 CPython 的局部变量是静态槽位不是 dictQ3__slots__为什么不能用vars()✅ 因为__slots__禁用了__dict__Q4globals()能改别人模块吗❌ 不能只能改当前模块六、终极对照示例x1classDemo:y2def__init__(self):self.z3dDemo()print(vars(d))# {z: 3}print(dir(d))# [... y, z]print(locals())# 包含 x, Demo, dprint(globals())# 同 locals()