serializer = HeroCounterSerializer(instance, data=request.data, partial=True)
尝试运行包含以上所列代码的模块将导致def foo():
global a
def bar():
nonlocal a
a = 6
bar()
a = 5
foo()
print(a)
。但是我希望它可以运行并打印SyntaxError: no binding for nonlocal 'a' found
,为什么不呢?
请注意,如果我们将6
语句替换为绑定名称global a
的语句(例如a
或from something import otherthing as a
),则没有{{1} },然后a = 0
语句按预期输出SyntaxError
。
我读了https://docs.python.org/3/reference/executionmodel.html#naming-and-binding,但不理解print(a)
和5
的语句。
答案 0 :(得分:1)
a
绑定在顶级名称空间中。
nonlocal
语句使对应的名称引用最近的封闭函数范围中的先前绑定的变量。
但是a
没有绑定在函数范围内,所以
SyntaxError
在编译时引发
换句话说,global
不会影响a
的绑定位置。
答案 1 :(得分:-2)
a = 5
def foo():
global a
def bar():
global a
a = 6
bar()
foo()
print(a)
此打印6
nonlocal语句使对应的名称引用最近的封闭函数范围中的先前绑定的变量。