|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码1:
- >>> x = 880
- >>> def myfunc():
- x = 520
- print(x)
-
- >>> myfunc()
- 520
复制代码
代码2:
- >>> def myfunc():
- print(x)
- x = 520
- print(x)
-
- >>> myfunc()
- Traceback (most recent call last):
- File "<pyshell#13>", line 1, in <module>
- myfunc()
- File "<pyshell#12>", line 2, in myfunc
- print(x)
- UnboundLocalError: local variable 'x' referenced before assignment
复制代码
代码2 相比 代码1 ,只是多了一个print(x)语句, 咋就报错了呢? 感觉是变量作用域的问题,但是不知道错在哪里了, 请老师指点。
你的理解是正确的!在函数中,只要我们对一个变量进行赋值操作,无论这个赋值操作在哪里,Python 都会认为这个变量是局部的,除非你明确地用 global 或 nonlocal 声明它。如果在赋值之前就试图访问这个变量,就会遇到 UnboundLocalError 错误。
这是因为在编译函数的时候,Python 会决定变量是全局的还是局部的。在函数体中,任何在赋值语句( = )左侧的变量,都会被认为是局部变量,除非明确地声明为全局变量或非局部变量。
对于你的第二个问题,其实不仅仅是赋值语句会引起这个问题,任何试图修改一个变量的操作都会让 Python 将这个变量视为局部的,如果没有明确声明它是全局的。例如:
- x = 880
- def myfunc():
- x += 1 # This is effectively an assignment operation
- print(x)
- myfunc()
复制代码
这段代码也会抛出 UnboundLocalError 错误,因为 x += 1 本质上是 x = x + 1 ,是一种赋值操作。Python 认为 x 是局部的,但是在赋值之前已经引用了 x ,导致错误。
所以总的来说,只要在函数内部修改变量的值,如果不想让 Python 将其视为局部变量,就需要使用 global 或 nonlocal 关键字明确声明。
|
|