在 Python 的函数中嵌套的函数中使用全局变量

Using a global variable inside a function nested in a function in Python

我想知道为什么我的代码不起作用。我预计它会 return 11 而不是它创建一个异常:

def f():

   counter = 1

   def f1():

      global counter

      counter += 1

   while True:

       f1()

       if counter>10:

           return(counter)

f()

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-219-0ec059b9bfe1> in <module>()
----> 1 f()

<ipython-input-218-50c23b042204> in f()
      9         counter += 1
     10 
---> 11     f1()
     12 
     13     if counter>10:

<ipython-input-218-50c23b042204> in f1()
      7         global counter
      8 
----> 9         counter += 1
     10 
     11     f1()

NameError: name 'counter' is not defined

既然 counter 被声明为全局变量,并且它出现并定义在 f1() 的周围环境中 -- 在 f() 内部 -- 为什么我会收到此错误消息?

错误是因为您试图在全局 counter 尚未被赋值时递增它的值。 f() 函数中的计数器与 f1() 函数中的全局 counter 处于不同的范围和不同的变量。

您必须为将在其中使用此全局变量的每个范围指定 global counter。因此,这样做应该可以解决您的问题:

def f():
    global counter
    counter = 1

    def f1():
        global counter
        counter += 1

    f1()
    if counter > 10:
        return(counter)

f()

我还建议避免在没有充分理由的情况下在函数内声明函数并避免使用全局变量,因为它会使程序复杂化。更好的做法是将 counter 作为参数传递给函数,并将 return 作为结果传递。

不使用全局变量或嵌套函数的示例:

def f():
    counter = 1
    result = f1(counter)

    if result > 10:
        return(result)

def f1(argument):
    argument += 1
    return argument

f()