Python - 在以前在全局范围内查找的函数内重新分配名称

7 python

为什么我在下面的第三个代码中出错,但在前两个中却没有?我使用的是Python 3.6.0,Anaconda 4.3.1(64位)Jupyter.

代码1:

c = 100
def fib():
    c = 20
    a = c
    print ("a in fib", a)
    print ("c in fib", c)
fib()
print ("c", c)
Run Code Online (Sandbox Code Playgroud)

代码1的输出:

a in fib 20
c in fib 20
c 100
Run Code Online (Sandbox Code Playgroud)

代码2:

c = 100
def fib():
    a = c
    print ("a in fib", a)
    print ("c in fib", c)   
fib()
print ("c", c)
Run Code Online (Sandbox Code Playgroud)

代码2的输出:

a in fib 100
c in fib 100
c 100
Run Code Online (Sandbox Code Playgroud)

代码3:

c = 100
def fib():
    a = c
    print ("a in fib", a)
    print ("c in fib", c)
    c = 20  
fib()
print ("c", c)
Run Code Online (Sandbox Code Playgroud)

代码3的输出:


UnboundLocalError                         Traceback (most recent call last)
<ipython-input-42-d6affa26dc65> in <module>()
      7 
      8 
----> 9 fib()
     10 print ("c", c)

<ipython-input-42-d6affa26dc65> in fib()
      1 c = 100
      2 def fib():
----> 3     a = c
      4     print ("a in fib", a)
      5     print ("c in fib", c)

UnboundLocalError: local variable 'c' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

小智 1

我不能肯定地说,但我认为最可能的解释是前两个看到变量“c”的全局版本。

第三个必须看到您在“fib”函数的底部定义了一个局部变量“c”,因此不使用全局“c”变量。确实,这是一个很好的例子,说明了为什么不应该以这种方式使用全局变量。