函数的作用域、global与nonlocal

global

表示不再使用局部局部作用域中的内容,而是改用全局作用域中的变量

 1 a = 100
 2
 3
 4 def func():
 5     global a   # 表示不再局部创建这个变量,而是直接使用这个全局的a
 6     a = 28
 7     print(a)
 8
 9
10 func()
11 print(a)    

执行结果

28
28

Process finished with exit code 0

对于可变的数据类型如列表、字典等也可以使用global

 1 lst = [1, 2, 3]
 2 dic = {1: 1, 2: 2}
 3
 4
 5 def func():
 6     global lst
 7     global dic
 8     lst = [2, 3, 4]
 9     dic = {1: 10, 2: 20}
10     print(lst)
11     print(dic)
12
13
14 func()
15 print(lst)
16 print(dic)

执行结果

[2, 3, 4]
{1: 10, 2: 20}
[2, 3, 4]
{1: 10, 2: 20}

Process finished with exit code 0

对于可变数据类型,如果不加global,那么可以追加元素,删除元素,修改元素,但是不能直接赋值(就是不能 lst =[....]),直接赋值的结果是创建一个局部的列表或字典

 1 lst = ["麻花疼", "刘强东", "雷军军"]
 2 dic = {"马云": "淘宝"}
 3
 4
 5 def func():
 6     lst.append("马云云")
 7     # lst = ["马化腾", "雷军"]
 8     lst.remove("刘强东")
 9     dic["强东"] = "京东"
10     dic["马云"] = "支付宝"
11     print(lst)
12     print(dic)
13
14
15 func()
16 print(lst)
17 print(dic)

执行结果

[‘麻花疼‘, ‘雷军军‘, ‘马云云‘]
{‘马云‘: ‘支付宝‘, ‘强东‘: ‘京东‘}
[‘麻花疼‘, ‘雷军军‘, ‘马云云‘]
{‘马云‘: ‘支付宝‘, ‘强东‘: ‘京东‘}

Process finished with exit code 0

如果在函数里面直接赋值,结果会是怎么样的呢,来看代码

 1 lst = ["麻花疼", "刘强东", "雷军军"]
 2 dic = {"马云": "淘宝"}
 3
 4
 5 def func():
 6     # lst.append("马云云")
 7     lst = ["马化腾", "雷军"]
 8     # lst.remove("刘强东")
 9     dic["强东"] = "京东"
10     # dic["马云"] = "支付宝"
11     print(lst)
12     print(dic)
13
14
15 func()
16 print(lst)
17 print(dic)

执行结果

[‘马化腾‘, ‘雷军‘]
{‘马云‘: ‘淘宝‘, ‘强东‘: ‘京东‘}
[‘麻花疼‘, ‘刘强东‘, ‘雷军军‘]
{‘马云‘: ‘淘宝‘, ‘强东‘: ‘京东‘}

Process finished with exit code 0

nonlocal

nonlocal表示在局部作用域内,调用父级命名空间中的变量

 1 a = 10
 2
 3
 4 def func1():
 5     a = 20  # 局部变量
 6
 7     def func2():
 8         # nonlocal a    # 调用func1里面的a(值为20)
 9         a = 30        # 将func1里面a的值改为30
10         print(a)      # 打印30
11
12     func2()
13     print(a)     # func1里面a的值已经改为30了,因此打印30,不加nonlocal打印20
14
15
16 func1()
17 print(a)    # 打印全局变量a(值为10)

执行结果

30
30
10

Process finished with exit code 0

综合运用

来看一段代码

a = 1

def func1():
    a = 2

    def func2():
        nonlocal a
        a = 3       

        def func3():
            a = 4
            print(a)
        print(a)
        func3()
        print(a)
    print(a)
    func2()
    print(a)     

print(a)
func1()
print(a)   

运行结果

1
2
3
4
3
3
1

Process finished with exit code 0

来看分析,注意执行顺序,从上往下,遇到函数定义跳过,遇到函数调用时跳转到函数定义,定义完接着之前的位置执行。

a = 1      # 创建全局变量a(值为1)

def func1():
    a = 2      # 创建局部变量a

    def func2():
        nonlocal a    # 调用func1(父级命名空间)里面的a
        a = 3       # 把func1里面a的值改为3

        def func3():
            a = 4    # 创建局部变量a
            print(a)    # 打印func3里面局部变量a的值4-----4
        print(a)     # 打印func2里面的a的值3------3
        func3()
        print(a)    # 打印func2里面的a的值3(func3里面的a不影响func2的a)------5
    print(a)        # 打印func1里的局部变量a的值2------2
    func2()
    print(a)     # 打印func1里面的a的值3(func1里面的a已经被func2改成了3)-------6

print(a)    # 打印全局变量a的值1------------1
func1()    # 跳转到func1定义的位置
print(a)   # 打印1---------7

总结

(1)调用变量是要搞清楚变量是全局变量还是局部变量,如果是局部变量的话是属于哪个函数的,它能否被其子函数调用

(2)注意代码的执行顺序,代码从上往下执行,遇到函数定义跳过,等到遇到函数调用时才跳转到定义的部分开始执行,执行完了后再跳转到函数调用的地方

原文地址:https://www.cnblogs.com/zzliu/p/10161791.html

时间: 2024-11-02 14:38:16

函数的作用域、global与nonlocal的相关文章

python学习第十天,名称空间与作用域,函数的嵌套,global 和 nonlocal

名称空间: 内置名称空间: 在打开pytharm是加载 全局名称空间: 在运行py文件是加载 局部名称空间(临时名称空间) :在py文件中调用时加载 def func(): ----->函数定义 pass ------->函数体 func()------------->函数调用 函数定义时:内存中只储存与函数名的对应关系,函数体的内容不储存 函数调用时:才执行函数体的内容,创建临时空间,随着函数执行结束,内存中的临时名称空间里面的内容也清空 作用域: 全局作用域:内置名称空间里的内容+全

python(动态传参、命名空间、函数嵌套、global和nonlocal关键字)

一.函数的动态传参 1.*args位置参数动态传参 def chi(*food): print(food) chi("烧烤","火锅","虾吃虾涮","烤鱼") 多个位置参数传递进去,收到的内容是元组tuple,动态参数的位置必须要在位置参数后面 2**kwargs 关键字参数动态传参 def chi(**food): print(food) chi(zhangqing="吃点好的",lianda=&quo

函数里面的global 和 nonlocal 关键字的使用

"""global和nonlocal关键字:当修改全局变量时,使用global关键字声明:当修改嵌套作用域(enclosing作用域,外层非全局作用域)时,使用nonlocal关键字声明: """ #修改全局变量时,使用global关键字声明: a=10def f():        global a  # global修改全局变量,先声明    a=20    print(a)        def f1():        a=30     

函数的第二节课,动态传参,动态关键字参数,作用域,关键字global和nonlocal

今日内容总结: 一.函数参数--动态传参 动态参数必须是在位置参数后面,比如:def chi(a,b,*food): print("我要吃",a,b,food)chi("大米饭","小米饭","黄瓜","西红柿") 默认值参数必须是在最后位置,比如:def chi(a,b,*food,c="馒头"): print(a,b,food,c)chi("香蕉", "

Python全栈__动态参数、名称空间、作用域、作用域链、加载顺序、函数的嵌套、global、nonlocal

1.动态参数 当实参数量与形参数量相等时,参数传递正常. def func1(a, b, c): pass func1(1, 2, 3) 当实参数量与形参数量不相等时,则会报错. def func1(a, b, c): pass func1(1, 2, 3, 4, 5, 6, 6) 用户传入到函数中的实参数量不确定时,或者为了以后扩展,此时要用到动态参数 *args  **kwargs(万能参数). 顺序: 位置参数,*args,默认参数,**kwargs 1.*args *args是接收的是所

函数参数补充、名称空间与作用域、global与nonlocal

函数参数补充 # 1. 命名关键字参数(了解)# 命名关键字参数:在定义函数时,*后定义的参数,如下所示,称之为命名关键字参数# 特点:# 1.命名关键字实参必须按照key=value的形式为其传值# def func(x,y,*,a,b): # 其中,a和b称之为命名关键字参数# print(x,y)# print(a,b)## # func(1,2,b=222,a=111) # 示例# def func(x,y,*,a=11111,b):# print(x,y)# print(a,b)##

python中global 和 nonlocal 的作用域

python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . 一 global global关键字用来在函数或其他局部作用域中使用全局变量.但是如果不修改全局变量也可以不使用global关键字. 1 gcount = 0 2 3 def global_test(): 4 gcount+=1 5 print (gcount) 6 global_test() D:\Python34\python.exe E:/PycharmProje

python13 1.函数的嵌套定义 2.global、nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器

## 复习 '''1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值  eg:fn()() => fn的返回值一定是函数使用:1)直接被其他变量接收 - 将函数的内存地址直接给其他变量 => 被赋值的变量也是函数对象2)可以作为函数的参数 - 函数的形参接收到的实参是函数对象 => 形参被赋值后也是函数对象3)可以作为函数的返回值 - 用变量在外界调用并接受这个函数的值 => 用来接收

函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用

一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部空间:函数定义时,会记录下函数名与函数体的对应关系(什么都没有,只要内存地址,只有执行时才会在内存中临时开辟一个临时空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失) 加载顺序:内置空间 > 全局空间 > 局部空间 取值顺序:局部空间 > 全局空间 > 内置空间 作用域 全

Python之函数(四)函数的嵌套和global、nonlocal

函数的嵌套 函数的嵌套 def func() print(1) def f1(): print(2) return f1() func() 结果为:1 2 不管在什么位置,只要是函数+()就是在调用此函数 函数调用执行后,函数体中开辟的空间就自动销毁了 def func(): a=1 def foo(): b=2 print(b) print(a) def f1(): print(b) return f1() return foo() print(func()) 结果为:2 1 2 None p