Python范围规则究竟是什么?
如果我有一些代码:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
Run Code Online (Sandbox Code Playgroud)
在哪里x找到?一些可能的选择包括以下列表:
在执行期间,当函数spam在其他地方传递时,也存在上下文.也许lambda函数的传递方式有点不同?
某处必须有简单的参考或算法.对于中级Python程序员来说,这是一个令人困惑的世界.
给出以下代码:
def A() :
b = 1
def B() :
# I can access 'b' from here.
print( b )
# But can i modify 'b' here? 'global' and assignment will not work.
B()
A()
Run Code Online (Sandbox Code Playgroud)
对于B()函数变量中的代码,b在外部作用域中,但不在全局作用域中.是否可以b从B()函数内修改变量?当然我可以从这里读取它print(),但是如何修改呢?
在Python中,以下代码有效:
a = 1
b = 2
def test():
print a, b
test()
Run Code Online (Sandbox Code Playgroud)
以下代码有效:
a = 1
b = 2
def test():
if a == 1:
b = 3
print a, b
test()
Run Code Online (Sandbox Code Playgroud)
但是,下列情况不工作:
a = 1
b = 2
def test():
if a == 1:
a = 3
print a, b
test()
Run Code Online (Sandbox Code Playgroud)
最后一个块的结果是一条UnboundLocalError消息,说a在分配之前被引用.
我知道我可以做的最后一块工作如果我添加global a的test()定义,所以它知道哪些a我在说什么.
为什么在分配新值时不会出错b?
我是否创建了一个局部b变量,它并没有对我大喊大叫,因为我不是在分配之前尝试引用它?
但如果是这种情况,为什么我可以print a, b在第一个区块的情况下,而不必global …