我昨天在this question看到了一些我以前没见过的代码,特别是这一行:
for xyz[num] in possible[num]:
...
因此,当此循环运行时,来自possible[num]
的元素将分配到位置xyz
的列表num
。我真的很困惑,所以我做了一些测试,这里有一些更明确的等效代码:
for value in possible[num]:
xyz[num] = value
...
我绝对打算总是使用第二种格式,因为我发现第一种格式比它的价值更令人困惑,但我很好奇......所以:
是否有充分的理由使用此“功能”,如果没有,为什么允许?
以下是我提出的几个愚蠢的用例(愚蠢因为有更好的方法可以做同样的事情),第一个用于将字母表的字母旋转13个位置,第二个用于创建一个字典,用于将字符从rot13映射到字符13的位置。
>>> import string
>>> rot13 = [None]*26
>>> for i, rot13[i%26] in enumerate(string.ascii_lowercase, 13): pass
...
>>> ''.join(rot13)
'nopqrstuvwxyzabcdefghijklm'
>>> rot13_dict = {}
>>> for k, rot13_dict[k] in zip(rot13, string.ascii_lowercase): pass
...
>>> print json.dumps(rot13_dict, sort_keys=True)
{"a": "n", "b": "o", "c": "p", "d": "q", "e": "r", "f": "s", "g": "t", "h": "u", "i": "v", "j": "w", "k": "x", "l": "y", "m": "z", "n": "a", "o": "b", "p": "c", "q": "d", "r": "e", "s": "f", "t": "g", "u": "h", "v": "i", "w": "j", "x": "k", "y": "l", "z": "m"}
答案 0 :(得分:10)
允许这样做的原因是简单。 “循环变量”列表具有相同的grammar as any other assignment target。例如,在赋值中允许使用元组解包,因此在for
循环中也允许使用它,这当然非常有用。为循环变量的分配定义一个单独的语法对我来说似乎是假的 - 常规赋值和循环变量赋值的语义是相同的。
答案 1 :(得分:3)
我认为这是编程风格的问题,或者不使用这种技术。很明显,对于优秀的人来说,这样的循环最初看起来并不那么明显。因此,我自己宁愿建议使用更清晰的方法,特别是如果您希望您的代码可以被其他可能不太了解语言的人阅读。
然而,如果不允许这样的构造,那将是对python的哲学和机制的突破。这可以清楚地看到,因为循环接受一个序列(列表或字符串)并迭代它的每个元素,将每次迭代中的当前值存储到要给定的变量中。变量是对Object的引用,因此很明显,它是一个临时变量,一个数组的字段或甚至是不同的东西都无关紧要。