for循环遍历列表时修改元素不生效,如何保留Pythonic风格实现?
第一种写法失效的根本原因
for num in a 遍历的过程中,num 只是从列表中取出的临时值拷贝,针对int这类不可变数据类型,修改num的值完全不会触达原列表的存储,因此原列表不会发生变化。
保留Pythonic风格的实现方案
方案1:需要原地修改原列表
用Python内置的enumerate()函数同时获取索引和元素值,既保留了直接判断元素值的写法逻辑,也能通过索引修改原列表:
a = [1, 2, 3] for idx, num in enumerate(a): if num == 3: a[idx] = 2 # 运行结果:[1, 2, 2]
这种写法比range(len(a))更符合Python的编码习惯,可读性更高。
方案2:允许生成新列表(更推荐)
如果没有强制要求原地修改原列表,列表推导式是最简洁的Pythonic实现:
a = [1, 2, 3] a = [2 if num == 3 else num for num in a] # 运行结果:[1, 2, 2]
一行即可完成逻辑,执行效率也高于显式for循环。
内容的提问来源于stack exchange,提问作者salzig1
相关产品推荐
相关产品推荐

