全局变量未赋值引用报错:如何判断Python全局变量是否为空?
全局变量空值判断与未赋值引用问题解决
首先看你的代码里有个容易踩的坑:你在Example类里定义的patientName = 0是类属性,但函数A里用global patientName声明的是一个完全独立的模块级全局变量——这俩根本不是同一个东西!这也是后续报错的根源之一:你以为在类里初始化了变量,但实际函数里用的是另一个没被初始化的全局变量。
当点击事件触发C函数时,模块级的patientName还没被A函数赋值,甚至连定义都没有(因为global只是声明要使用全局变量,但如果全局作用域里压根没这个变量,只有在赋值时才会创建它),所以直接访问就会抛出NameError: name 'patientName' is not defined。
下面给你两种解决方案,根据你的实际需求选:
方案一:正确使用模块级全局变量
先在模块最顶部初始化全局变量为None(明确表示未赋值状态),之后就可以安全判断了:
# 提前在模块级初始化全局变量,避免未定义报错 patientName = None class Example(): # 如果不需要类属性,这里可以留空或者做其他定义 pass def A(): global patientName patientName = "12" def B(): print(patientName) # 调用A后打印"12",否则打印None def C(): # 先判断是否未赋值 if patientName is None: print("patientName还没有被赋值哦!") elif patientName != "123": print("patientName的值不是123") else: print("patientName的值是123")
关键说明:
patientName = None提前在全局作用域创建了变量,哪怕还没赋有效值,也不会出现未定义报错- 判断空值用
is None而不是== None,因为None是Python的单例对象,is判断更准确高效
方案二:用类属性替代全局变量(更推荐)
既然你已经定义了Example类,不如直接用类属性来存储值,这样更符合面向对象的设计,也避免了全局变量的混乱:
class Example(): # 初始化类属性为None patientName = None def A(): # 直接通过类名访问类属性,不需要global声明 Example.patientName = "12" def B(): print(Example.patientName) def C(): if Example.patientName is None: print("patientName尚未赋值") elif Example.patientName != "123": print("patientName的值不是123") else: print("patientName的值是123")
关键说明:
- 类属性属于类本身,所有函数都可以通过
Example.patientName访问,不需要global关键字 - 同样提前初始化为
None,确保触发C时可以安全判断
额外提示:如果一定要检查变量是否存在(不推荐)
如果你不想提前初始化变量,也可以通过检查全局命名空间来判断变量是否存在,但这种写法不够清晰,一般不推荐:
def C(): if 'patientName' not in globals(): print("patientName还没被定义") elif globals()['patientName'] != "123": print("patientName的值不是123")
这种方式虽然能解决报错,但代码可读性差,还容易引入其他问题,所以优先推荐前面两种提前初始化的方案。
内容的提问来源于stack exchange,提问作者Cowarrior
相关产品推荐
相关产品推荐

