2012-02-22 54 views
6

我昨天看到一些代码this question,我从来没有见过的,此行特别是:for循环中的列表/词典赋值有什么用处?

for xyz[num] in possible[num]: 
    ... 

所以因为这样循环运行,从possible[num]的元素在num位置分配给列表xyz。我真的被这个困惑,所以我做了一些测试,这里是一些等价的代码是一个小更明确:

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"} 
+1

我想你误解了代码。 'num'在那里是固定值。你的例子更复杂... – 2012-02-22 00:16:39

+2

也许它是一个有用的codegolf :) – 2012-02-22 00:24:12

+0

@gnibbler你能转置一个矩阵就地使用这个? – 2012-02-22 00:32:41

回答

10

这是允许的原因是简单。 “循环变量”列表具有相同的grammar as any other assignment target。作为一个例子,在赋值中允许元组解包,所以它也可以在for循环中使用,这当然非常有用。为循环变量的分配定义单独的语法对我来说似乎是人为的 - 常规赋值和循环变量赋值的语义是相同的。

+5

+1这不是一个真正的功能,它只是语言的一致性。 – 2012-02-22 00:21:14

+1

这不是因为你可以这样做,你必须这样做。 – dugres 2012-02-22 12:46:28

3

我认为这是一个编程风格的问题,或不使用这种技术。显然,对于杰出人士来说,这样的循环在初看时并不那么明显。因此,我自己宁愿建议使用更清晰的方法,尤其是如果您希望您的代码可能被其他人可能不懂的语言读懂的话。

然而,如果这样的构造不被允许,它将突破python的哲学和机制。这可以清楚地看到,因为循环接受一个序列(一个列表或一个字符串)并遍历每个迭代中存储当前值的每个元素到要给定的变量中。一个变量是对一个对象的引用,因此很明显,它是一个临时变量,一个数组的一个字段还是甚至不同的东西并不重要。