for循环期间列表/字典分配有什么用处吗?

And*_*ark 6 python

我昨天在这个问题上看到了一些我以前没见过的代码,特别是这一行:

for xyz[num] in possible[num]:
    ...
Run Code Online (Sandbox Code Playgroud)

因此,当此循环运行时,元素将possible[num]被分配到xyz位置的列表num.我真的很困惑,所以我做了一些测试,这里有一些更明确的等效代码:

for value in possible[num]:
    xyz[num] = value
    ...
Run Code Online (Sandbox Code Playgroud)

我绝对打算总是使用第二种格式,因为我发现第一种格式比它的价值更令人困惑,但我很好奇......所以:

是否有充分的理由使用这个"功能",如果没有,为什么允许?

以下是我提出的几个愚蠢的用例(愚蠢因为有更好的方法可以做同样的事情),第一个用于将字母表的字母旋转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"}
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 10

允许这样做的原因是简单."循环变量"列表与任何其他分配目标具有相同的语法.作为一个例子,在赋值中允许使用元组解包,因此它也允许在for循环中使用,这当然非常有用.为循环变量的赋值定义一个单独的语法对我来说似乎是假的 - 常规赋值和循环变量赋值的语义是相同的.

  • +1这不是一个真正的功能,它只是语言的一致性. (5认同)