Python遍历列表时修改元素两种行为差异的原因解析
为什么两段Python代码对原列表的修改结果不同?
先看两段代码以及它们的输出:
代码1及输出
temp = [{"a":"b"},{"c":"d"},{"e":"f"},{"a":"c"}] for item in temp: if "a" in item: item["a"] = "x" print(temp)
输出:
[{'a': 'x'}, {'c': 'd'}, {'e': 'f'}, {'a': 'x'}]
代码2及输出
temp = [{"a":"b"},{"c":"d"},{"e":"f"},{"a":"c"}] for item in temp: item = {} print(temp)
输出:
[{'a': 'b'}, {'c': 'd'}, {'e': 'f'}, {'a': 'c'}]
核心原因:Python的变量引用机制
可以把列表里的字典想象成一栋栋真实的房子,列表存储的其实是这些房子的“地址”,而循环里的item就是你拿到的对应房子的钥匙。
对于代码1:
你拿着item这把钥匙,打开房子修改了里面的东西(item["a"] = "x")——这直接操作了列表里记录地址的那栋真实房子,所以原列表里的字典自然会跟着变化,就像你改了房子里的家具,房子本身肯定不一样了。对于代码2:
item = {}相当于你把手里的旧钥匙扔了,重新拿了一把指向空房子的新钥匙。这时候你只是换了item指向的目标,完全没碰列表里原来的那栋房子,所以原列表里的内容当然不会有任何变化。
再直白点总结:
- 当你通过
item修改它指向对象的内部内容时,会影响原列表里的对象(因为操作的是同一个东西)。 - 当你直接给
item重新赋值新对象时,只是改变了item自己的指向,和原列表里的对象毫无关系。
内容的提问来源于stack exchange,提问作者Yash Gupta
相关产品推荐
相关产品推荐

