实践结论:在函数内部,只有用 global 声明后,才能定义全局变量或修改已有的同名全局变量;而在 if name _ == 'main _': 块里,直接赋值就是给全局变量赋值,不需要也不能用 global。无论哪种方式定义的全局变量,模块作用域内的其他函数都能访问到。但这两种做法都不是好实践。最好的做法是:把全局变量放在模块的最顶层(所有函数和类定义之外),紧接在 import 语句之后,不要放在 main 块中,也不要放在某个单独的函数里。这样声明位置清晰、执行顺序确定,模块无论被导入还是直接运行,行为都一致,也不会让函数产生隐蔽的全局副作用。
全局变量:
1、在函数外部定义
2、在函数内使用global关键字定义一个变量,如果该函数不被调用,则该全局变量不生效;只有该函数被调用,该全局变量才生效,之前没有同名全局变量,则创建,之前已有同名全局变量,则修改即覆盖之前的同名全局变量。
3、函数内部没有先定义一个变量而直接访问这个变量时,访问的是全局变量,如果这个全局变量没有定义,则会报错
4、函数外部访问一个变量,只能访问全局变量,如果这个全局变量没有定义,则会报错
5、全局变量可能导致代码难以维护和调试。因为它能在模块任何地方被读写,代码一长,很难追踪"谁在什么时候改了它",排查问题时要来回找上下文;多个函数同时依赖它时,还容易互相干扰。
局部变量:
1、在函数内部定义且没有 global 关键字。
2、只在该函数内部有效,只在函数执行期间存在,函数结束后被销毁。
3、不同函数的局部变量可以同名,因为每次调用函数都会为该函数创建独立的局部作用域,局部变量只在自己的函数内有效,互不影响。
不同函数内部的局部变量名称相同没有问题,只在各自的函数内部生效
python
def function1():
x = 10 # 局部变量,只在function1中有效
print("x:", x)
def function2():
x = 20 # 局部变量,只在function2中有效
print("x:", x)
function1()
function2()
输出结果:
x: 10
x: 20
局部变量只在函数内部生效
python
# function()里面的是局部变量x,print("x", x)在函数外访问的是全局变量x,全局变量x不存在,所以报错
def function():
x = 30 #局部变量
print("x:", x)
if __name__ == '__main__':
function()
print("x", x)
输出结果:
x: 30
NameError: name 'x' is not defined
函数内部没有先定义一个变量而直接访问这个变量时,访问的是全局变量,如果这个全局变量没有定义,则会报错
python
def function1():
x = 10 # 局部变量
print("x:", x)
def function2():
print("x:", x)
function1()
function2()
输出结果:
x: 10
NameError: name 'x' is not defined
函数内部全局变量和局部变量的区别global关键字示例:
python
#代码1,函数内部使用global关键字定义变量,则是全局变量
x = 5 # 全局变量
def function1():
global x
x = 30 # 全局变量,会修改之前同名的全局变量
print("x:", x)
function1()
print("x:", x)
输出结果:
x: 30
x: 30
#代码2,函数内部不使用global关键字定义变量,则是局部变量,该局部变量和全局变量同名
x = 5 # 全局变量
def function2():
x = 30 # 局部变量,函数内部生效,不会修改之前同名的全局变量
print("x:", x)
function2()
print("x:", x)
输出结果:
x: 30
x: 5
全局变量在函数function1中定义,函数function2中一个和全局变量同名的局部变量,函数function3()没有定义变量则只能调用全局变量
python
def function1():
global x
x = 10 # 全局变量
print("x:", x)
def function2():
x = 20 # 局部变量,函数内部生效,不会修改之前同名的全局变量
print("x:", x)
def function3():
print("x:", x) # 这个x没有定义,直接使用全局变量
function1()
function2()
function3()
输出结果:
x: 10
x: 20
x: 10
if name _ == 'main_': 块里的变量也是全局变量示例:
python
# x = 5 覆盖 x = 6,两者都在函数外部都是全局变量(),谁后执行,谁就覆盖之前的。
x =6 # 全局变量
def function():
print("x:", x)
if __name__ == '__main__':
x = 5 # 全局变量
function()
print("x:", x)
输出结果:
x: 5
x: 5
函数内使用global关键字定义一个变量,如果该函数不被调用,则该全局变量不生效;只有该函数被调用,该全局变量才生效
python
#代码1,function1() 被调用,x = 7生效,并对全局 x 产生影响。
x = 6 # 第一步 全局 x = 6
def function():
print("x:", x) # 第三步 读全局 x
def function1():
global x # 第四步 声明:全局 x
x = 7 # 第四步 全局 x 被改成 7
if __name__ == '__main__':
x = 5 # 第二步 全局 x 被改成 5
function() # 第三步 读到全局 x = 5,输出 5
function1() # 第四步 全局 x 被改成 7
print("x:", x) # 第五步 读到全局 x = 7,输出 7
输出结果:
x: 5
x: 7
#代码2,function1() 没有被调用,x =7不生效, 对全局 x 没有影响。
x = 6 # 第一步 全局 x = 6
def function():
print("x:", x) # 第三步 读全局 x
def function1():
global x
x = 7
if __name__ == '__main__':
x = 5 # 第二步 全局 x 被改成 5
function() # 第三步 读到全局 x = 5,输出 5
print("x:", x) # 第四步 读到全局 x = 5,输出 5
输出结果:
x: 5
x: 5