Python初学者零碎基础笔记(三)全局变量与局部变量,闭包变量的区分用法

全局变量与局部变量,闭包变量的区分

先扩展:

  1. 内建作用域:系统的函数和变量,在所有的文件中都可以使用
    例:print(max(1,2,344,55)) # max属于内建作用域
  2. 全局作用域:在一个代码文件中,变量(必须在函数外定义) 从定义开 始到本文件结束
  3. 闭包作用域:嵌套函数中,外部函数里 变量从定义开始到函数结束
  4. 局部作用域: 在一个函数里,变量从定义开始到函数结束
  5. 内建作用域 > 全局作用域 >闭包作用域>局部作用域
    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

猜你喜欢

转载自blog.csdn.net/weixin_49757981/article/details/109011417
今日推荐