经管之家送您一份
应届毕业生专属福利!
求职就业群
感谢您参与论坛问题回答
经管之家送您两个论坛币!
+2 论坛币
Python基础知识:什么是非局部语句?
有同学曾在微信中问小编什么是非局部语句(nonlocal statement),本文就是对此的回答,希望没有发的太晚。
非局部语句是Python 3.x中新引入的特性,可以让你给外层但非全局作用域中的变量赋值。官方文档中的说法是,非局部语句可以让所列的标识符(identifier)指向最近的嵌套作用域(enclosing scope)中已经绑定过的变量,全局变量除外。 如果没有非局部语句一般来说,嵌套函数对于其外层作用域中的变量是有访问权限的。 [backcolor=rgb(238, 238, 238) !important][color=rgb(102, 102, 102) !important]
[color=rgb(170, 170, 170) !important]1
[color=rgb(170, 170, 170) !important]2
[color=rgb(170, 170, 170) !important]3
[color=rgb(170, 170, 170) !important]4
[color=rgb(170, 170, 170) !important]5
[color=rgb(170, 170, 170) !important]6
[color=rgb(170, 170, 170) !important]7
[color=rgb(170, 170, 170) !important]8
[color=rgb(170, 170, 170) !important]9
[color=rgb(170, 170, 170) !important]10
[color=rgb(170, 170, 170) !important]11
[color=rgb(170, 170, 170) !important]12
| [color=rgb(0, 111, 224) !important]>>>[color=rgb(0, 111, 224) !important] [color=teal !important]def [color=teal !important]outside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important]:
[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]msg[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"Outside!"
[color=rgb(0, 111, 224) !important] [color=teal !important]def [color=teal !important]inside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important]:
[color=rgb(0, 111, 224) !important] [color=teal !important]print[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]msg[color=rgb(51, 51, 51) !important])
[color=rgb(0, 111, 224) !important] [color=teal !important]inside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])
[color=rgb(0, 111, 224) !important] [color=teal !important]print[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]msg[color=rgb(51, 51, 51) !important])
[color=rgb(0, 111, 224) !important]>>>[color=rgb(0, 111, 224) !important] [color=teal !important]outside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])
[color=rgb(0, 45, 122) !important]Outside[color=rgb(0, 111, 224) !important]!
[color=rgb(0, 45, 122) !important]Outside[color=rgb(0, 111, 224) !important]!
|
我们在outside函数中声明了msg变量,并赋值为“Outside!”。然后,在inside函数中打印msg的值。结果证明,inside成功获得了外层作用域中msg的值。 但是如果我们想给外层作用域中的变量赋值时,是不是按照平常的赋值操作就可以修改它的值呢? [backcolor=rgb(238, 238, 238) !important][color=rgb(102, 102, 102) !important]
[color=rgb(170, 170, 170) !important]1
[color=rgb(170, 170, 170) !important]2
[color=rgb(170, 170, 170) !important]3
[color=rgb(170, 170, 170) !important]4
[color=rgb(170, 170, 170) !important]5
[color=rgb(170, 170, 170) !important]6
[color=rgb(170, 170, 170) !important]7
[color=rgb(170, 170, 170) !important]8
[color=rgb(170, 170, 170) !important]9
[color=rgb(170, 170, 170) !important]10
[color=rgb(170, 170, 170) !important]11
| [color=rgb(0, 111, 224) !important]>>>[color=rgb(0, 111, 224) !important] [color=teal !important]def [color=teal !important]outside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important]:
[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]msg[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"Outside!"
[color=rgb(0, 111, 224) !important] [color=teal !important]def [color=teal !important]inside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])[color=rgb(0, 111, 224) !important]:
[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]msg[color=rgb(0, 111, 224) !important] [color=rgb(0, 111, 224) !important]=[color=rgb(0, 111, 224) !important] [color=rgb(221, 17, 68) !important]"Inside!"
[color=rgb(0, 111, 224) !important] [color=teal !important]print[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]msg[color=rgb(51, 51, 51) !important])
[color=rgb(0, 111, 224) !important] [color=teal !important]inside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])
[color=rgb(0, 111, 224) !important] [color=teal !important]print[color=rgb(51, 51, 51) !important]([color=rgb(0, 45, 122) !important]msg[color=rgb(51, 51, 51) !important])
[color=rgb(0, 111, 224) !important]>>>[color=rgb(0, 111, 224) !important] [color=teal !important]outside[color=rgb(51, 51, 51) !important]([color=rgb(51, 51, 51) !important])
[color=rgb(0, 45, 122) !important]Inside[color=rgb(0, 111, 224) !important]![color=rgb(0, 111, 224) !important] [color=rgb(184, 92, 0) !important]# inside函数打印的msg
[color=rgb(0, 45, 122) !important]Outside[color=rgb(0, 111, 224) !important]![color=rgb(0, 111, 224) !important] [color=rgb(184, 92, 0) !important]# outside函数打印的msg
|
在inside函数中,我们想给msg变量赋值为”Inside!”。运行outside时,inside函数中msg的值为”Inside!”,但是在outside函数中却保留了原先的值! 之所以出现这个情况,是因为在inside函数中,Python实际上并没有为之前已经创建的msg变量赋值,而是在inside函数的局部作用域(local scope)中创建了一个名叫msg的新变量,但是这样就和外层作用域(outer scope)中的变量重名了。 这说明,嵌套函数对外层作用域中的变量其实只有只读访问权限。如果我们在这个示例中的inside函数的顶部再加一个print(msg)语句,那么就会出现UnboundLocalError: local variable 'msg' referenced before assignment这个错误。 非局部语句的引入,就是要尽量减少这种变量名冲突情况的出现,同时也让嵌套函数更加方便的操作外层函数中的变量。更加详细的原因,请看参考资料部分的PEP-3104。 转载地址:http://python.jobbole.com/84465/
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
|