2012-02-22 57 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的哲學和機制。這可以清楚地看到,因爲循環接受一個序列(一個列表或一個字符串)並遍歷每個迭代中存儲當前值的每個元素到要給定的變量中。一個變量是對一個對象的引用,因此很明顯,它是一個臨時變量,一個數組的一個字段還是甚至不同的東西並不重要。