global在函数中,作用是声明全局变量,如果对全局变量重新赋值或修改,在全局域中执行了该函数,全局变量也会跟着改变;如果在全局域中没有执行过该函数,则全局变量不变:
name = 'malin'
def chang():
global name # 声明全局变量
name = 'liuli' # 改全局变量
print(name)
chang() # 已经改掉了全局变量
print(name)
输出:
liuli
liuli
对比:虽然函数定义是改掉全局变量,但是没执行就没有生效
name = 'malin'
def chang():
global name # 声明全局变量
name = 'liuli' # 改全局变量
print(name)
print(name)
输出:
malin
如果没有global关键字,优先读取局部变量,能读取全局变量,虽然无法对全局变量进行重新赋值,但是可以做修改
name = ['malin','liusong']
def chang():
name.append('zhoutianyou')
print(name)
chang()
print(name)
输出:
[‘malin’, ‘liusong’, ‘zhoutianyou’]
[‘malin’, ‘liusong’, ‘zhoutianyou’]
global声明的时候,只能写在前面,否则会报错:
name = 'malin'
def chang():
name = 'liuli'
global name
print(name)
chang()
输出:
报错
书写规范:
全局变量全部大写,局部变量全部小写
最内层改变了全局变量,虽然名字相同,但是互不影响:
name = '刚娘'
def weihou():
name = '陈卓'
def weiweihou():
global name
name = '冷静'
weiweihou()
print(name)
print(name)
weihou()
print(name)
输出:
刚娘
陈卓
冷静
nonlocal声明变量为上级同名变量:
name = '刚娘'
def weihou():
name = '陈卓'
def weiweihou():
nonlocal name
name = '冷静'
weiweihou()
print(name)
print(name)
weihou()
print(name)
输出:
刚娘
冷静
刚娘