为何用range遍历列表可将元组转列表,直接遍历却不行?
为什么用
for i in lst:遍历无法修改列表中的元组? 核心原因很简单:第二种遍历里的i只是原列表元素的临时引用,重新赋值i = list(i)只是改变了这个临时变量的指向,完全没碰原列表里的元素。
先看第一种能生效的写法
lst = [(8, 7), (9, 6), (4, 8), (3, 5), (9, 4)] for i in range(len(lst)): lst[i] = list(lst[i])
这里遍历的是列表的索引,lst[i] = ...是直接对原列表的指定位置进行赋值操作——把该位置原来的元组替换成新生成的列表,所以原列表会被实实在在地修改。
再看第二种不生效的本质
for i in lst: i = list(i)
当你用for i in lst遍历的时候,每次循环的i会临时绑定到列表里的一个元组对象上。比如第一次循环,i指向(8,7)这个元组;当你执行i = list(i),其实是创建了一个新的列表[8,7],然后把i这个变量的指向从原来的元组改成了这个新列表,但原列表里的(8,7)根本没被替换,还是老样子。循环结束后,这些临时的i变量会被丢弃,原列表自然毫无变化。
正确的遍历修改方式
如果想用遍历元素的方式修改原列表,可以用enumerate同时拿到索引和元素:
lst = [(8, 7), (9, 6), (4, 8), (3, 5), (9, 4)] for idx, item in enumerate(lst): lst[idx] = list(item)
或者更简洁的列表推导式,直接生成新列表替换原列表:
lst = [(8, 7), (9, 6), (4, 8), (3, 5), (9, 4)] lst = [list(item) for item in lst]
内容的提问来源于stack exchange,提问作者cherishedMoose
相关产品推荐
相关产品推荐

