Python中为何无法在类中使用全局变量?附报错示例
Python双下划线变量的名称修饰坑你踩过吗?
嘿,这事儿我太熟了!你遇到的其实是Python的**名称修饰(name mangling)**机制,跟全局变量本身没关系,是类里的双下划线变量被自动“改名”了。
先重现一下你遇到的问题代码:
__var = 10 def test01(): return __var r1 = test01() # 输出10,完全正常 class Test: def test02(self): return __var r2 = Test().test02() # 直接报错:NameError: name '_Test__var' is not defined
为啥会报错?
核心原因是:Python会对类定义内部的双下划线开头的变量自动进行名称修饰。
- 当你在
Test类的方法里写__var时,Python会偷偷把它改成_Test__var——这是Python用来模拟“私有属性”的机制,防止子类不小心覆盖父类的内部变量。 - 你全局定义的是
__var,但类里的代码实际找的是_Test__var,自然就找不到,报NameError了。 - 而普通函数
test01里用__var就没问题,因为名称修饰只在类定义的内部范围生效,普通函数里的双下划线变量不会被修改。
那你后来的写法为啥能行?
你按错误提示定义了_Test__var = 10,代码就正常了:
_Test__var = 10 class Test: def test02(self): return __var r2 = Test().test02() # 正常输出10
这是因为你提前定义了Python要找的那个被修饰后的变量名,类里的__var被解析成_Test__var后,就能匹配到全局的这个变量了。
给你两个实用小建议:
- 如果只是想在类里调用全局变量,别用双下划线开头,用单下划线(
_var)或者普通变量名就行,这样不会触发名称修饰,直接用全局变量就好。 - 双下划线变量本来就是为类内部的“私有”属性设计的,正确的用法应该是在类内部定义:
class Test: __var = 10 # 类内部的私有属性 def test02(self): return self.__var r2 = Test().test02() # 正常输出10
这种情况下Python会自动把类里的__var改成_Test__var,内部调用完全没问题。
内容的提问来源于stack exchange,提问作者jia Jimmy
相关产品推荐
相关产品推荐

