如何优雅地处理全局变量?

2024-03-29 09:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    ...

在多线程环境中,flag1和{}是布尔函数(全局变量),它们会在其他地方修改。如果我能这样做的话,那就太优雅了:

^{pr2}$

有没有办法做到这一点?在

编辑:

1.看到一些人建议list,问题是,像这样的列表flags = [flag1, flag2, flag3, ...]假设flag1 = Trueflag2 = Falseflag3 = True,这使得{},如果你在另一个线程的其他地方修改flag1 = Falseflags不会相应地改变,所以这肯定行不通。在

{1美元^

2.事实上,我发现了一个原始答案,建议while [flag1, flag2, flag3, ...][index],而且它确实有效!只是不知道他为什么删除了他的答案?在

有趣的部分:

刚刚测试了以下部分:

^{3}$

它不会起作用,但有趣的是,这实际上起作用了:

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

所以我假设[flag1, flag2, flag3][index]实际上返回原始变量?有人能再解释一点吗?在


Tags: 答案falsetrueindexdef地方do建议
3条回答

使用ternary运算符。在

def doSomething(index):
    while (flag1 if index else flag2):
        do stuff

对于这个问题,可能有一个更优雅的设计解决方案,但是要避开列表中没有更新的变量,只需将它们包装在class

>>> class Flag():
    def __init__(self,flag):
        self.flag = flag


>>> flag_1 = Flag(True)
>>> flag_2 = Flag(False)
>>> flag_list = [flag_1, flag_2]
>>> flag_1.flag = False
>>> flag_list[0].flag
False

我相信当你创建引用列表或字典时,文本的引用不会改变。在

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

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

解决这个问题的一种方法是再添加一层对象包装器。如果布尔值包含在对象中,因为列表中的引用指向标签所指向的对象,即对象,字段中的更改将被反映出来。在

事实上,为什么不直接使用flags作为全局变量呢?如果脚本足够聪明,可以在特定位置硬编码一个特定标志中的更改,也许我们可以替换

flag1 = False

^{pr2}$

甚至在传递信息的时候

flags[mess] = False

flags可以是list、dict或normal对象。好的旧消息传递方式到处都是!在

相关问题 更多 >