我的代码如下:
done = False
def function():
for loop:
code
if not comply:
done = True #let's say that the code enters this if-statement
while done == False:
function()
由于某种原因,当我的代码进入if语句时,它在使用function()完成后不会退出while循环。
但是,如果我这样编码:
done = False
while done == False:
for loop:
code
if not comply:
done = True #let's say that the code enters this if-statement
...它退出while循环。这是怎么回事?
我确保我的代码进入if语句。我还没有运行调试器因为我的代码有很多循环(非常大的2D数组)而且我放弃了调试,因为它太繁琐了。为什么“完成”在功能中没有被改变?
答案 0 :(得分:36)
您的问题是函数创建自己的命名空间,这意味着函数中的done
与第二个示例中的done
不同。使用global done
使用第一个done
而不是创建新的。{/ p>
def function():
global done
for loop:
code
if not comply:
done = True
可以找到有关如何使用global
的说明here
答案 1 :(得分:5)
done=False
def function():
global done
for loop:
code
if not comply:
done = True
你需要使用global关键字让解释器知道你引用全局变量done
,否则它将创建一个只能在函数中读取的另一个。
答案 2 :(得分:3)
使用global
,只有这样你才能修改全局变量,否则函数内的done = True
之类的语句将声明一个名为done
的新局部变量:
done = False
def function():
global done
for loop:
code
if not comply:
done = True
详细了解the global statement。
答案 3 :(得分:0)
class
而不是global
:处理(不使用)全局变量的另一种方法是将希望全局的函数和变量包装在类中。
虽然对于这种特定情况来说有点繁重-类为项目增加了许多功能和灵活性。 (个人)强烈推荐。
class Processor():
"""Class container for processing stuff."""
_done = False
def function(self):
"""A function which processes stuff."""
# Some code here ...
self._done = True
# See the flag changing.
proc = Processor()
print('Processing complete:', proc._done)
proc.function()
print('Processing complete:', proc._done)
Processing complete: False
Processing complete: True