python3 nonlocal vs global

考虑这样一个python程序:

x = 12

def func():

x = 1

func()

print(x)

输出为:x = 12

因为函数内部定义的x被认为只属于局部作用域,为了表明我么引用的是全局的x而不是新定义一个局部的x,

可以使用global关键字:

x = 12

def func();

global x

x = 1

func()

print(x)

可以发现输出已经变成了1,也就是在函数内部成功修改了一个全局变量

还有一种情形,就是嵌套的局部作用域的问题:

def g():

x = 12

func():

x = 1

func()

print(x)

g()

这样输出的结果为12,因为func函数调用时定义的X也被认为只属于局部作用域了,但是此时函数g()里定义的x并非全局变量,用前述的global关键字肯定是不行的,

所以又有了nonlocal,这样写:

def g():

x = 12

func():

nonlocal x

x = 1

func()

print(x)

g()

这时,输出的结果就是我们预期的1了,nonlocal就是声明要引用一个外部作用域(全局作用域除外)中定义的变量。

需要指出的是,上述关键字之所以需要,是因为我们试图去修改全局变量或者处于外部作用域的变量,如果在局部作用域内部重定义全局变量或外部作用域变量,仅仅只读访问(比如print出来)是完全没有问题的,参看下面这个例子:

a = 12
def g():
    b = 11
    def func():
        print(a)
        print(b)
    func()
    return
if __name__ == ‘__main__‘:
    g()

时间: 2024-11-06 09:36:39

python3 nonlocal vs global的相关文章

[转]nonlocal和global

在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则. 然而当在一个函数内部为一个变量赋值时,并不是按照上面所说LEGB规则来首先找到变量,之后为该变量赋值.在Python中,在函数中为一个变量赋值时,有下面这样一条规则: 当在函数中给一个变量名赋值是(而不是在一个表达式中对其进行引用),Pytho

[TimLinux] Python nonlocal和global的作用

1. 执行代码 以下实例都是通过执行以下代码,需要把以下执行代码放在后面实例代码的后面. a = outer_func()print("call a()") a() a() a() b = outer_func()print("call b()") b() b() b() 2. 未使用nonlocal def outer_func(): count = 3 def inner_func(): count += 1 print("count", c

Py3 nonlocal和global的不同

在Py2中,闭包只能读外部函数的变量,不能改写它.为了解决这个问题,Py3引入了nonlocal,在闭包内用nonlocal声明变量,就可以让解释器在外层函数中查找变量名2种作用域:全局作用域和局部作用域.全局作用域是指当前代码所在模块的作用域,局部作用域是指当前函数或方法所在的作用域.局部作用域里的代码可以读外部作用域里的变量,不能更改它.如果想更改它,这里就要使用global 实例 关键字nonlocal的作用与关键字global类似,使用nonlocal关键字可以在一个嵌套的函数中修改嵌套

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

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

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

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

Python Global和Nonlocal的用法

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

【python3】raise,assert,nonlocal 关键字解读

raise Python 使用 raise 语句抛出一个指定的异常. raise语法格式如下: raise [Exception [, args [, traceback]]] try--finally try-finally 语句无论是否发生异常都将执行最后的代码. assert Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常. 断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linu

动态传参(*args **kwargs 无敌传参) 作用域globals locals和名称空间 函数的嵌套 关键字nonlcas global

动态传参(重点) *, ***, ** :形参: 聚合 位置参数* -> 元组 关键字** -> 字典 实参: 打散 列表, 字符串, 元素 -> * 字典 -> ** 形参的顺序(重点): 位置 *args(位置参数动态传参) 默认值 **kwargs(关键字动态传参)以后写参数. 可以随意的进行搭配, 但是, 顺序不能串 * 在形参位置. * 表示不定参数-接收的是位置参数接收到的位置参数的动态传参: 都是元组def chi(*food): # 在形参这里把传递过来的实参进行了

python变量和作用域

1.作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:globa,全局变量,就是模块级别定义的变量: B:built-in,系统固定模块里面的变量,比如int, bytearray等. 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB. x = int(2.9) # int