python global vs nonlocal (2)

上一篇中简述了这两个关键字的基本用法:

global用于在局部作用于修改或重定义全局变量

nonlocal用于在内部作用域修改或重定义外部变量(全局变量除外)

这只是很浅的理解方式

注意python的特性,变量有mutable和immutable之分,对于mutable变量的,在内部作用域内做修改时完全可以的,不需要上面两个关键字的修饰,比如下面的程序:

a = 12
li = [1, 2, 3]
def g():
    b = 11
    li[2] = 4   #li变量在内部作用域内被修改了
    def func():
        print(a)
        print(b)
    func()
    return
if __name__ == ‘__main__‘:
    g()
    print(li)

但是这样做,情况却又变了:

a = 12

li = [1, 2, 3]
def g():
    b = 11
    li = [1, 1, 1] #这时修改的是整个list,相当于变量重定义了,所以li被认为是局部的,并不能影响全局变量
    def func():
        print(a)
        print(b)
    func()
    return
if __name__ == ‘__main__‘:
    g()
    print(li)

结合python的内存管理方面的知识,我们可以这样理解:只要不涉及到变量内存的重新分配(比如immutable变量赋值,mutable变量整体赋值),在内部、嵌套作用域内的所有操作都是可以的;一旦要用同一个名字指向另一块内存,就要特别说清楚这种改变是全局的还是局部的

时间: 2024-12-10 23:49:48

python global vs nonlocal (2)的相关文章

Python Global和Nonlocal的用法

nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当前代码块. 这意味着列出的标识符将被解释为全局变量. 尽管自由变量可能指的是全局变量而不被声明为全局变量. global语句中列出的名称不得用于该全局语句之前的文本代码块中. global语句中列出的名称不能定义为形式参数,也不能在 for 循环控制目标.class定义.函数定义.import语句或

python global 和 nonlocal 的理解

参考: https://www.cnblogs.com/summer-cool/p/3884595.html https://blog.csdn.net/xCyansun/article/details/79672634 对于global来说: 如果存在全局变量a,和函数 f 而函数f内部不存在 " a = expressions ",函数内部可以使用全局变量a: 示例代码如下: 代码 a = 10 def test1(): b = a + 1 print(b) test1() 运行结

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

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

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

python globals()和locals(),global和nonlocal,以及闭包

1. 命名空间和作用域 命名空间 1. 内置命名空间: python解释内部运行时的变量函数 2. 全局命名空间: 我们在py文件中直接声明出来的变量, 函数 3. 局部命名空间: 在函数内部声明的变量和函数 作用域: 1. 全局作用域: 内置 + 全局 2. 局部作用域: 局部 globals() 查看全局作用域中的名字 locals() 查看当前作用域中的名字 2. global和nonlocal global: 把全局变量拿到局部来用. nonlocal:把离他最近的一层的变量拿过来, 不

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

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

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是接收的是所

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

global与nonlocal

global与nonlocal:   global关键字:   x=1 def foo(): x=10 print(x)     #打印: 10 foo() print(x)          #打印:  1 #############>>>局部的x不会影响全局的x x=1 def foo():                        #使用global关键字,在局部修改全局变量 global x x=10 print(x)     #打印: 10 foo() print(x)