def doSomething(index):
    if index == 0:
        while flag1:
            do stuff
    elif index == 1:
        while flag2:
            do stuff

    ...


在多线程环境中,flag1flag2是布尔值(全局变量),可以在其他地方进行修改。如果我能做到这一点,那将是非常优雅的:

def doSomething(index):
    while (put either flag1 or flag2 here according to index):
        do stuff


有没有办法做到这一点?

编辑:

1.看到一些建议列表的人,事情是,像这样的列表flags = [flag1, flag2, flag3, ...]假定为flag1 = Trueflag2 = Falseflag3 = True,这就是flags = [True, False, True],如果在另一个线程的其他地方修改了flag1 = Falseflags不会相应地更改,因此这绝对不会起作用。



2.实际上,我找到了一个提示while [flag1, flag2, flag3, ...][index]的原始答案,并且确实有效!只是不知道为什么他删除了答案?

有趣的部分:

刚刚测试了以下部分:

def doSomething(index):
    flags = [flag1, flag2, flag3]
    while flags[index]:
        do stuff


它是行不通的,但有趣的是,这实际上是有效的:

def doSomething(index):
    while [flag1, flag2, flag3][index]:
        do stuff


所以我想[flag1, flag2, flag3][index]实际上返回原始变量?有人可以解释更多吗?

最佳答案

我相信会发生什么,当您创建引用列表或字典时,文字引用不会改变。

创建标志列表时,flags[0]指向flag1指向的内容,即False

当您将值重新分配给flag1时,您将更改为flag1指向的内容,但是flags[0]仍指向False

解决此问题的一种方法是增加一层对象包装。如果布尔值包含在对象中,由于列表中的引用指向标签所指向的对象(即对象),因此字段中的更改将得到反映。

实际上,为什么不只将flags用作全局变量呢?如果脚本足够聪明,可以在特定位置将更改标记硬编码到一个特定位置,那么也许我们可以替换

flag1 = False




flags[0] = False


甚至消息传递

flags[mess] = False


flags可以是列表,字典或普通对象。到处都是很好的旧消息传递样式!

关于python - 优雅地处理全局变量如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25049874/

10-12 18:50