Python nonlocal语句做了什么(在Python 3.0及更高版本中)?
官方Python网站上没有文档,help("nonlocal")也没有用.
我正在尝试在Python 2.6中实现一个闭包,我需要访问一个非局部变量,但似乎这个关键字在python 2.x中不可用.如何在这些版本的python中访问闭包中的非局部变量?
我正在学习编程语言的概念。
我在 python 语法中发现了术语“nonlocal”。
python中的nonlocal是什么意思?
python variables programming-languages global-variables python-nonlocal
我想测试在这个问题的答案中使用的非本地语句的示例:
def outer():
x = 1
def inner():
nonlocal x
x = 2
print("inner:", x)
inner()
print("outer:", x)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试加载此代码时,我总是会收到语法错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "t.py", line 4
nonlocal x
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
有没有人知道我在这里做错了什么(我得到的每个例子的语法错误,包含nonlocal).
我正在尝试对Python 3源代码中的范围进行一些分析,而我仍然坚持非局部语句语句在类定义中的工作方式.
据我了解,类定义在新的命名空间(称为dict)中执行其主体,并将类名绑定到类型(name,bases,dict)的结果.非局部x应该起作用,只要它引用一个绑定在非局部范围内某处的变量.
从这里我希望编译和运行以下代码:
class A:
v = 1
class B:
nonlocal v
v = 2
Run Code Online (Sandbox Code Playgroud)
但这失败了
SyntaxError: no binding for nonlocal 'v' found
Run Code Online (Sandbox Code Playgroud)
而以下代码运行完美
def A():
v = 1
class B:
nonlocal v
v = 2
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释函数定义的闭包和类定义之间的区别吗?
例如:assginment语句将声明一个新的局部变量.
foo = 'global'
def func1():
foo = 'func1'
def func2():
foo = 'local variable in func2'
Run Code Online (Sandbox Code Playgroud)
使用全局声明将在全局使用foo:
def func2():
global foo
foo = 'global changed in func2' #changed the foo value in global scope
Run Code Online (Sandbox Code Playgroud)
如何在func1范围中更改变量foo?
谢谢你的帮助.
编辑:
谢谢Brandon Craig Rhodes,我终于理解了你的意思.
如果嵌套的范围超过3个,我可以将变量存储在列表中.
foo = ['global', 'function1', 'function2']
def func1():
foo[1] = 'func1'
def func2():
foo[2] = 'func2'
foo[1] = 'func1 modified in func2'
Run Code Online (Sandbox Code Playgroud)
我实际上只使用了一个全局变量.
所以,如果有两个嵌套函数,我们可以使用
nonlocal foo
Run Code Online (Sandbox Code Playgroud)
和
global foo
Run Code Online (Sandbox Code Playgroud)
如果嵌套了三个以上的函数,
并且每个函数在其他函数范围内使用变量,
为什么不声明全局列表变量?
谢谢你的帮助!!!
我试图在Ruby中编写一个闭包.这是用Python编写的代码:
def counter():
x = 0
def increment(y):
nonlocal x
x += y
print(x)
return increment
Run Code Online (Sandbox Code Playgroud)
在Ruby中是否存在"非本地"等价物,因此我可以从内部增量访问变量x并对其进行更改?
def some_func(a):
def access_a():
print(a)
access_a()
Run Code Online (Sandbox Code Playgroud)
输出 的值a。但是,如果我想像这样更改a嵌套函数:
def some_func(a):
def change_a():
a += 1
print(a)
change_a()
Run Code Online (Sandbox Code Playgroud)
它引发UnboundLocalError异常。
我知道a是一个非局部变量,但为什么我可以在不声明的情况下访问它nonlocal a?
来自维基百科
我需要以与使用python 3.x中的'nonlocal'关键字类似的方式访问外部函数变量.有没有办法在python 2.6中做到这一点?(不一定使用nonlocal关键字)
如何获取当前范围的非局部变量?功能vars,locals并且globals存在,但是有一个功能来获得nonlocals?
调用时为什么不列出nonlocals vars?
我的问题是,有没有办法来枚举当前范围内都有效的变量,既不vars或globals包括非本地人AFAICT.
我经常使用vars如下代码:
'{meh[0]}/{meh[3]} {a}{b}{c}'.format(**vars())
Run Code Online (Sandbox Code Playgroud)
如果这些变量中的任何变量都在包含函数的范围内,则会失败.
python ×10
python-nonlocal ×10
python-3.x ×4
closures ×3
global ×2
scope ×2
variables ×2
class ×1
django ×1
nested ×1
python-2.6 ×1
python-2.x ×1
ruby ×1
syntax-error ×1