44

我的代码如下:

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 语句。我还没有运行调试器,因为我的代码有很多循环(相当大的二维数组),我放弃了调试,因为它太乏味了。当它在一个函数中时,为什么“完成”没有被改变?

4

4 回答 4

58

您的问题是函数创建了自己的命名空间,这意味着done函数内部done与第二个示例中的命名空间不同。使用global done第一个done而不是创建一个新的。

def function():
    global done
    for loop:
        code
        if not comply:
            done = True

global可以在此处找到有关如何使用的说明

于 2012-09-30T23:23:35.250 回答
7
done=False
def function():
    global done
    for loop:
        code
        if not comply:
            done = True

您需要使用 global 关键字让解释器知道您引用了全局变量done,否则它将创建一个只能在函数中读取的不同变量。

于 2012-09-30T23:23:41.707 回答
7

使用global,只有这样你才能修改全局变量,否则done = True函数内部的语句将声明一个名为的新局部变量done

done = False
def function():
    global done
    for loop:
        code
        if not comply:
            done = True

阅读有关全球声明的更多信息。

于 2012-09-30T23:23:44.347 回答
1

使用 aclass而不是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
于 2020-01-21T09:35:32.103 回答