python - “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))
可以做到这一点。
谁能告诉我这是什么原因?
解决方案
在
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]))
它看起来像第一个一样简单的重新分配,但它实际上是一个改变列表本身内容的可变操作。
推荐阅读
- reactjs - 如何在 React 中递归构建答案对象?
- linux - 如果 url 包含在引号中,CURL 仅获取文件的第一行
- go - Golang Base64 签名验证 VS CryptoJS
- c# - 如何验证 Json 中是否存在密钥列表?
- vba - 获取文件名中的时间保存在 Word 宏中
- neural-network - Julia Flux 双重推理问题
- android - Android在按钮按下时获取高分辨率位置信息
- unity3d - 我可以使实例变量独立于预制变量吗?
- c - 是什么导致读取访问冲突/溢出?
- r - ggplot2 geom_sf - 显示多边形颜色但不显示名称的地图图例