功能不改变全局变量

时间:2012-09-30 23:21:18

标签: python global-variables

我的代码如下:

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数组)而且我放弃了调试,因为它太繁琐了。为什么“完成”在功能中没有被改变?

4 个答案:

答案 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