这段操作Python字典的代码片段为什么可以正常运行?
Python特殊for循环语法运行逻辑解释
首先给出完整代码片段:
>>> x = {'a': 1, 'b': 2} >>> y = {} >>> for k, y[k] in x.items(): pass ... >>> y {'a': 1, 'b': 2}
运行逻辑拆解
这个代码能生效完全是利用了Python for循环的迭代解包赋值规则,本质没有用到黑魔法,拆解后很好理解:
- 每次遍历
x.items()的时候,都会返回一个存储当前键值对的二元组,第一次是('a', 1),第二次是('b', 2) - for循环每次拿到这个二元组后,会按位置把它赋值给
for后面写的变量/表达式序列,这个操作和普通的多元赋值没有任何区别 - 也就是说每次迭代等价于执行一行赋值语句:
k, y[k] = 本次迭代返回的二元组
比如第一次迭代就等价于k, y[k] = ('a', 1):首先会给变量k赋值为'a',再给y['a']赋值为1,直接就完成了字典y的键值对写入 - 循环体里的
pass只是占位用的,所有赋值逻辑已经在for循环的解包阶段完成了,不需要额外写其他代码
为什么这个写法合法
很多人会误以为for后面只能写普通变量名,其实Python没有这个限制:
只要是合法的左值表达式(也就是可以被赋值的对象),都可以出现在解包的位置。
y[k]就是典型的左值表达式,完全可以作为赋值的目标。
另外赋值操作是从左到右执行的,会先给k赋值为当前遍历到的键,再给y[k]赋值为对应的值,顺序完全正确不会出现找不到键的报错。
内容的提问来源于stack exchange,提问作者asdrubalivan
相关产品推荐
相关产品推荐

