|  | 
 
| 
代码1:
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 复制代码>>> 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  关键字明确声明。
 | 
 |