我想知道为什么我的代码无法正常工作。我希望它会返回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()内)中显示和定义,为什么我会收到此错误消息?
您的建议将不胜感激。
答案 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()