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

use*_*077 4 environment function global-variables python-3.x

我想知道为什么我的代码不起作用。我预计它会返回 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
Run Code Online (Sandbox Code Playgroud)

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

Kel*_*ndy 7

它不是全局变量。在全球范围内它不存在。使用nonlocal而不是global.


Kar*_*arl 5

错误是因为您试图在counter尚未给定值的情况下增加全局值。f()函数中的计数器与函数中的全局变量在不同的范围和不同的变量counterf1()

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

def f():
    global counter
    counter = 1

    def f1():
        global counter
        counter += 1

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

f()
Run Code Online (Sandbox Code Playgroud)

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

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

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

    if result > 10:
        return(result)

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

f()
Run Code Online (Sandbox Code Playgroud)