一、全局变量
在一个文件顶部定义的变量可以供该文件中任意函数调用
1.定义全局变量
name = '全局变量' #定义全局变量 def name(): pass name()
2.调用全局变量
name = '全局变量' #定义全局变量 def name(): print('name()',name)#调用全局变量 name()
3.修改全局变量
name = '123' #定义全局变量 def change_name(): #name = '213' #直接进行修改的话,其实是修改的名为name的局部变量 gobal name #声明此处的name是全局变量 name = '213' #修改全局变量 print(name) change_name() print(name)
二、局部变量
局部变量是在某个函数中声明的仅限于当前函数使用的变量。
def chang_name(): name = "name" #定义局部变量 name = 'lastname' #修改局部变量 print('name()',name) #调用局部变量 print('py',name) #会报错,name仅限于chang_name函数使用。
三、global关键词
如果函数无global关键词:
1.有声明局部变量
NAME = ["a" , 'b'] def test1(): NAME = 'c' print(NAME) #使用的是局部变量 test1()
2.无声明局部变量
NAME = ["a" , 'b'] def test2(): NAME.append('c') #无法修改全局变量,但若全局变量是列表等可更改类型,可对其元素进行修改。 print(NAME) #使用的是全局变量 test2()
如果函数有global关键词
1.有声明局部变量
def test3():#存在多个同名变量,会报错。如果需要使用全局变量,将其写在前面。 NAME = 'c' global NAME print(NAME) test3()
2.无声明局部变量
NAME = ["a" , 'b'] def test4(): global NAME NAME = [1 , 2] #可直接对全局变量进行修改,变量实质上就是全局变量 print(NAME) test4()
为避免全局变量与局部变量混淆,应将全局变量全大些(NAME),局部变量全小写(name)。
未声明全局变量:
def a(): global name name = 1 print(name) #错误:name 'name' is not defined global无法将不为全局变量的局部变量提升至全局变量
四、nonlocal关键词
nonlocal在第一层函数内:
name = 'x' def a(): global name #错误:no binding for nonlocal 'name' found name = 'a' print(name) print(name) a() print(name)nonlocal无法获取全局变量。
四、函数的嵌套
函数在不被调用的时候只加载不执行。
基本嵌套的执行流程:
def a(): # name = 'a' #第二步 print(name) #第三步 def b(): name = "b" #第五步 print(name) #第六步 def c(): name = 'c' #第九步 print(name) #第十部 print(name) #第七步 c() #第八步 b() #第四步 print(name) #第十一步 a() #第一步
有global关键词修饰的:
name = 'x' #第一步 def a(): name = 'a' #第四步 def b(): global name #第六步,获取全局变量 name(x) name = "b" #第七步,修改全局变量name的值x为b b() #第五步 print(name) #第八步输出a的局部变量 a print(name) #第二步:输出x a() #第三步 print(name)#第九步:输出修改后的全局变量 b
有nonlocal关键词修饰的:
name = 'x' #第一步 def a(): name = 'a' #第四步 def b(): nonlocal name #第六步,获取a()的变量变量 name(a) name = "b" #第七步,修改a()的变量name的值a为b b() #第五步 print(name) #第八步输出a的局部变量 b print(name) #第二步:输出x a() #第三步 print(name)#第九步:输出全局变量 x
global和nonlocal混合修饰:
name = 'x' def a(): global name name = 'a' def b(): nonlocal name #错误:no binding for nonlocal 'name' found 上层函数通过global将name声明为全局变量,无法获取。 name = "b" b() print(name) print(name) a() print(name)