python中的传递赋值

python中的传递赋值,python,parameter-passing,Python,Parameter Passing,我知道这个问题已经被问过好几次了,但我仍然找不到解决问题的办法 我编写了一个函数来更改函数之外的内容(在本例中,是一个布尔变量)。虽然已知布尔变量是可变的,但我仍然无法更改它。这是我的代码: def test() : global cont do_something = True #Actually it was something else, but for easy reading, I set it as True if do_something :

我知道这个问题已经被问过好几次了,但我仍然找不到解决问题的办法

我编写了一个函数来更改函数之外的内容(在本例中,是一个布尔变量)。虽然已知布尔变量是可变的,但我仍然无法更改它。这是我的代码:

def test() :
    global cont
    do_something = True #Actually it was something else, but for easy reading, I set it as True
    if do_something :
        cont = False

def main() :
    cont = True
    while cont :
        test()
        print "Stop me"

print "HI"
main()
print "HI"
它只是进入了一个无限循环。 我知道下面的代码是有效的

def test() :
    global cont
    do_something = True #Actually it was something else, but for easy reading, I set it as True
    if do_something :
        cont = False


cont = True
print "HI"
while cont :
    test()
    print "Stop me"
print "HI"

这是否与全球标签有关?有人告诉我,如果我设置了一些全局性的东西,我可以在我的程序中的任何地方使用它。这是特例吗?因此,我如何才能将代码修改为功能性的(能够更改“cont”变量)谢谢。

在原始代码中,
cont
inside
main()
函数是一个局部变量,而不是全局变量,因此,即使您更改了全局变量
cont
inside
test()
,它不会反映在
main()
中的局部变量
cont

您必须将
main()
中的
cont
变量设置为全局变量

def test() :
    global cont
    do_something = True #Actually it was something else, but for easy reading, I set it as True
    if do_something :
        cont = False

def main() :
    global cont
    cont = True
    while cont :
        test()
        print "Stop me"

print "HI"
main()
print "HI"
请注意,应避免使用全局变量-


而且我相信它们在python中代价高昂。

还在主函数中添加了
global
语句:

def main() :
    global cont
    cont = True
    while cont :
        test()
        print "Stop me"

在Python中,如果在函数中指定一个变量,并且没有为此变量添加
global
语句,那么它将始终被视为局部变量。

应该避免使用global。原因是您创建的代码非常难以推理,因为到处的代码都可能发生更改,从而影响您当前试图调试或更改的代码的行为

因此,对于给定的问题,真正的解决方案是使用返回值在
main
test
之间进行通信。我对示例进行了扩充,以说明如何使用多个值作为返回,并说明如何在函数应该返回一个值,以及调用方应该继续的“元”信息的情况下应用该模式

def test():
    do_continue = True # both somehow computed
    value = 1000
    return do_continue, value

def main():
    while True:
        do_continue, result = test()
        if not do_continue:
             break

您还需要
main
中的
global const
,这是正确的,但您不应该这样做。传入变量并返回它。此外,布尔值是不可变的。我发现在解释python变量和作用域是如何工作的时候非常有用:前面的“before”是不相关的。如果在函数中的任何位置指定名称,则该名称将被视为该函数的本地名称(当然,除非它被声明为
global
nonlocal
)。