def doSomething(index):
if index == 0:
while flag1:
do stuff
elif index == 1:
while flag2:
do stuff
...
在多线程环境中,
flag1
和flag2
是布尔值(全局变量),可以在其他地方进行修改。如果我能做到这一点,那将是非常优雅的:def doSomething(index):
while (put either flag1 or flag2 here according to index):
do stuff
有没有办法做到这一点?
编辑:
1.看到一些建议列表的人,事情是,像这样的列表
flags = [flag1, flag2, flag3, ...]
假定为flag1 = True
,flag2 = False
,flag3 = True
,这就是flags = [True, False, True]
,如果在另一个线程的其他地方修改了flag1 = False
,flags
不会相应地更改,因此这绝对不会起作用。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/