函数不更改全局变量

6g8kf2rb  于 2021-08-20  发布在  Java
关注(0)|答案(4)|浏览(310)

我的代码如下:

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数组),我放弃了调试,因为它太单调了。为什么“完成”在函数中不被更改?

lf3rwulv

lf3rwulv1#

您的问题是函数创建自己的名称空间,这意味着 done 函数中的值与 done 在第二个例子中。使用 global done 使用第一个 done 而不是创建一个新的。

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

说明如何使用 global 可以在这里找到

iibxawm4

iibxawm42#

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

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

yqkkidmi

yqkkidmi3#

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

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

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

jei2mxaa

jei2mxaa4#

使用类而不是全局:

处理(而不是使用)全局变量的另一种方法是将希望全局的函数和变量 Package 到类中。
虽然这对于这个特定的案例来说有点沉重,但是类为项目添加了大量的功能和灵活性(个人)强烈推荐。

例如:

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

相关问题