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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:35:03