首页 > 解决方案 > “for i in alist”和“for i in range(len(alist))”有什么区别?

问题描述

我试图转换列表中所有元素的类型:

class Dict1(dict):
    pass
class Dict2(dict):
    pass
def print_type(alist):
    for i in range(len(alist)):
        print(type(alist[i]))
l=[]
for i in range(3):
    l.append(Dict1())


for element in l:
    element=Dict2(element)
print_type(l)


for i in range(len(l)):
    l[i]=Dict2(l[i])
print_type(l)

输出:

<class '__main__.Dict1'>
<class '__main__.Dict1'>
<class '__main__.Dict1'>
<class '__main__.Dict2'>
<class '__main__.Dict2'>
<class '__main__.Dict2'>

当我使用时for element in l,元素的类型不会转换为 Dict2,但是,for i in range(len(l))可以做到这一点。

谁能告诉我这是什么原因?

标签: pythonpython-3.xlist

解决方案


for element in l:
    element=Dict2(element)

element只是一个在列表中保存元素的变量。重新分配它只会改变element正在查看的内容,而不是循环中的元素所持有的内容。

这类似于a此处的 never changed:

a = 1
element = a
element = 2

print(a, element)  # 1 2

重新分配变量对碰巧正在查看同一对象的其他代码没有影响。

那么,为什么索引会按您的预期进行呢?因为索引会改变列表本身。

l[i]=Dict2(l[i])

实际上本质上是

l.__setitem__(i, Dict2(l[i]))

它看起来像第一个一样简单的重新分配,但它实际上是一个改变列表本身内容的可变操作。


推荐阅读