今天在编写代码的时候,想用一个全局变量,由于不了解global关键字和python的全局变量和局部变量定义,多次报错global variables:XXX is undefined at module level的错误,后来看了一下相关内容,现在整理如下。
首先会报这个错误就是因为全局变量还没有定义,就在函数体或者类中使用了global关键字,因此报错。例如:
def test():
global var
var += ["python"]
test()
这样就会报错

所以如果稍作修改加上全局变量的定义:
def test():
global var
var += ["python"]
print(var)
var=[] #定义全局变量
test()
则错误就解决了,输出为:

当然这边报错不报错还涉及到global关键字定义的数据类型,如果上面的var是个整型,那也不会有错误。这部分我了解还不是很了解,参考了一些博文,这部分待日后深入。
global关键字相关的链接:
https://blog.csdn.net/qq_28888837/article/details/88060376
https://www.jianshu.com/p/d51ffe92d68d
可变数据类型和不可变数据类型:
https://www.cnblogs.com/operationhome/p/9642460.html
以下是我对于全局变量的一些实验和理解。
python的全局变量和局部变量
全局变量:定义在函数体或者类之外的变量,(或许还有定义在main中的变量,这一点待进一步考证)
class test(object):
var3=3 #局部变量
pass
def test():
var2=2 #局部变量
pass
var=1 #全局变量
定义了这个全局变量var之后,如果想要在test函数或者test类中用的话,需要使用到global关键字,使用这个关键字,代表的是在项目的其他地方要是用的是同一个变量,要进行某一操作,比如要赋值之类的。如果不赋值,只是引用,那可以直接调用不用使用global关键字,这是引用的就是全局变量的值:
class test_class(object):
var3=3 #局部变量
def __init__(self):
if var ==1:
print("test_class:var is {}".format(1))
pass
def test_func():
if var==1:
print("test_func: var is {}".format(1))
var2=2 #局部变量
pass
var=1 #全局变量
test_class()
test_func()
运行结果:

如果需要赋值又不带global关键字,如下。就相当于在函数或者类中重新定义了一个和全局变量重名的局部变量,这时候这个赋值不会改变全局变量的值,并且在类中和函数中也不会认为是引用全局变量的值。
class test_class(object):
var3=3 #局部变量
def __init__(self):
var =3
if var ==1:
print("test_class:var is {}".format(1))
pass
def test_func():
var =3
if var==1:
print("test_func: var is {}".format(1))
var2=2 #局部变量
pass
var=1 #全局变量
test_class()
test_func()
以上这个代码,不会再有打印输出。
所以,如果想要使用到全局变量并且会有额外的操作,不止简单的引用,就要加上global关键字。
class test_class(object):
var3=3 #局部变量
def __init__(self):
global var #使用全局变量var
var =666 #对全局变量进行赋值
if var ==1:
print("test_class:var is {}".format(1))
pass
def test_func():
global var #使用全局变量
var =888 #对全局变量进行赋值
if var==1:
print("test_func: var is {}".format(1))
var2=2 #局部变量
pass
var=1 #全局变量
print("before run the other codes: var is {}".format(var))
test_class()
print("after run the test_class: var is {}".format(var))
test_func()
print("after runn the test_func:var is {}".format(var))
结果输出:
