在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 a, b事先声明?
让我给你链接到明确提到它的文档.
如果在函数体内的任何位置为变量分配了一个新值,则假定它是一个局部变量.
(强调我的)
因此,您的变量a是局部变量而不是全局变量.这是因为你有一个任务声明,
a = 3
Run Code Online (Sandbox Code Playgroud)
在代码的第三行.这使得a局部变量.并且在声明之前引用局部变量会导致错误UnboundLocalError.
但是,在第二个代码块中,您不会生成任何此类赋值语句,因此您不会收到任何此类错误.
另一个使用ful链接就是这个
引用函数或方法中的局部变量时引发,但没有值绑定到该变量.
因此,您指的是您在下一行中创建的局部变量.
为了防止这种情况,有两种方法
好方法 - 传递参数
将您的函数定义为def test(a):并将其命名为test(a)
糟糕的方式 - 使用 global
global a在函数调用的顶部有一行.
Python范围规则有点棘手!你需要掌握它们来掌握语言.看看这个
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |