Python中为函数绑定属性后为何无法在函数内部访问?
为何给函数添加属性后,函数内部仍无法访问该变量?
你遇到的问题核心是混淆了函数对象的属性和函数作用域内的变量,这是完全不同的两个东西:
- 当你执行
egg.a = 50时,你是给egg这个函数对象本身添加了一个属性——就像给类实例加属性一样,所以dir(egg)能看到它,但这个属性只属于函数对象本身,和函数执行时的作用域完全无关。 - 函数内部访问变量
a时,Python会按「局部作用域→闭包作用域→全局作用域→内置作用域」的顺序查找,根本不会去检索函数对象自身的属性,所以哪怕你给函数加了a属性,函数里的print(a)依然找不到它。
如果想让函数内部能访问这个属性,你需要在函数里明确通过函数对象来引用它:
def egg(): print(egg.a) # 直接访问函数对象的a属性 egg.a = 50 egg() # 此时会输出50
如果你的需求是动态改变函数内部的“变量”,也可以用全局变量的方式(但不推荐滥用全局变量):
a = 10 def egg(): print(a) egg() # 输出10 a = 50 egg() # 输出50
总结一下:函数对象的属性和函数作用域变量是两套独立的存储体系,Python不会自动把函数属性映射到函数作用域里,必须显式引用才行。
内容的提问来源于stack exchange,提问作者Raphael Gozlan
相关产品推荐
相关产品推荐

