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

时间:2018-08-02 21:34:02

标签: python-3.x function global-variables environment

我想知道为什么我的代码无法正常工作。我希望它会返回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

由于计数器被声明为全局变量,并且由于它在f1()的周围环境(在f()内)中显示和定义,为什么我会收到此错误消息?

您的建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

该错误是因为您试图在尚未赋予全局值counter的情况下增加其值。 f()函数中的计数器与counter函数中全局f1()的作用域和变量不同。

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

def f():
    global counter
    counter = 1

    def f1():
        global counter
        counter += 1

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

f()

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

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

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

    if result > 10:
        return(result)

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

f()