全局变量与局部变量,闭包变量的区分
先扩展:
- ) 内建作用域:系统的函数和变量,在所有的文件中都可以使用
例:print(max(1,2,344,55)) # max属于内建作用域 - )全局作用域:在一个代码文件中,变量(必须在函数外定义) 从定义开 始到本文件结束
- )闭包作用域:嵌套函数中,外部函数里 变量从定义开始到函数结束
- )局部作用域: 在一个函数里,变量从定义开始到函数结束
- )内建作用域 > 全局作用域 >闭包作用域>局部作用域
6 .) 变量同名问题: 变量查找规则: 从下往上,从里往外
(一)-------------------先区分全局变量与局部变量
1.全局变量的调用
name='小明' #全局变量(公共的,函数外定义,大家都可以调用)
def func():
print(name) #调用的是全局变量
func()
print(name)
def func1():
print(name) #调用的是全局变量
func1()
>>>小明
>>>小明
>>>小明
2.全局变量和局部重名,在函数里局部优先(例题小红)
name='小明' #全局变量(公共的,大家都可以调用)
def func():
print(name) #调用的是全局变量
def func1():
name="小红" #局部变量
print(name) #有局部变量先调用的是局部变量
func()
func1()
>>>小明
>>>小红
3.在函数,全局变量可以读取,不能直接修改;如果在函数中修改全局变量,必须施工global声明
例如:改变全局变量错误做法
name='小明' #全局变量
def func():
name=name+"是好人" #简写:name += "是好人"
#不可以直接改变全局变量
print(name)#调用的是全局变量
func()
>>>报错
>>>UnboundLocalError: local variable 'name' referenced before assignment
例:利用global修改全局变量
name='小明' #全局变量
def func1():
global name #借助global声明可以改变全局变量
name=name+"是好人" #简写:name += "是好人"
print(name)#已改变原来的全局变量
func1()
print(name)
>>>小明是好人 #原来的全局变量name为'小明'
>>>>小明是好人
例:修改局部变量,局部变量,相当于自己的东西,随时改变
name='小明' #全局变量
def func2():
name="小红" #局部变量
name=name+"是好人" #修改局部变量
print(name) #已改变原来的局部变量
func2()
>>>小红是好人 #原来的局部变量name为"小红"
扩展:改变全局变量后再次调用原函数会怎样?
结论:函数func的调用,原本print的是原全局变量
改变全局变量后再次调用func会发现print得到的结果不再是原来的值
name='小明' #全局变量
def func():
print(name)
func()
def func1():
global name #借助global声明可以改变全局变量
name=name+"是好人" #简写:name += "是好人"
print(name)#已改变原来的全局变量
func1()
func() #再次调用原函数
>>>小明 #---原来的值(全局变量)
>>>小明是好人
>>>小明是好人#-----后来的值
---------------------全局变量与局部变量,闭包变量分布
z=5 # 全局作用域
def outter():
x = 10 # 闭包作用域
def inner():
y = 9 # 局部作用域
print(x)
例:全局与闭包
a = 10 # 全局
def demo():
a = 30 # 闭包
print(a)
def inner():
a = 20 # 局部
pass
inner()
print(a)
demo()
print(a)
>>>30
>>>30
>>>10
例:闭包与局部
def wrapper1():
x = 10 # 闭包变量
def inner():
x = 100 # 局部优先
print(x)
inner()
print(x)
wrapper1()
>>>100
>>>10
例:全局,闭包与局部
x=5 #全局
def wrapper1():
x = 10 # 闭包变量
def inner():
x = 100 #局部
print(x)
inner()
print(x)
wrapper1()
print(x)
>>>100
>>>10
>>>5
例:在函数里利用nonlocal修改闭包变量
x=5 #全局变量
def wrapper1():
x = 10 # 闭包变量
def inner():
nonlocal x # 声明一下操作针对的是闭包变量x
x = 100 # 修改闭包变量x
print(x,"修改闭包变量nonlocal")
inner()
print(x)
print(x)
>>>100 修改闭包变量nonlocal
>>>100
>>>5
例:在函数里利用global修改全局变量
x=5 #全局变量
def wrapper1():
x = 10 # 闭包变量
def inner():
global x # 声明一下操作针对的是全局变量x
x = 100 #局部
print(x,"修改全局变量 global")
inner()
print(x)
wrapper1()
print(x)
>>>100 修改全局变量 global
>>>10
>>>100