lyitcc 2022-10-21 10:34 采纳率: 85.7%
浏览 17
已结题

列表推导式转换为for循环报错

问题遇到的现象和发生背景

列表推导式转化为正常的for循环就会报错,在运行for循环代码时会报错(RuntimeError: dictionary changed size during iteration)难道是在使用列表推导式时条件成立没有给vol2赋值?等待列表推导式结束才给vol2赋值?

用代码块功能插入代码,请勿粘贴截图
volumeA = 100
volumeB = 20
volumeC = 10
#
vol1 = []
vol2 = []
c=[]
vol1.extend((volumeA, volumeB, volumeC))
#
# print(globals().items())
#
# vol2 += [val for name, val in globals().items() if name.startswith('volume')]#列表推导式可以正常执行
#
for name,val in globals().items():#转化为for循环写法就会报错(RuntimeError: dictionary changed size during iteration)
    if name.startswith('volume'):
        vol2+=c.append(val)

运行结果及报错内容

img

我的解答思路和尝试过的方法

将全局变量赋予一个对象再去for循环得到该对象的里的key和value但是还会报错

我想要达到的结果

将列表推导式转换为for循环的写法,列表推导式的执行顺序和for循环有区别?求解答

  • 写回答

2条回答 默认 最新

  • lyitcc 2022-10-21 13:26
    关注

    有位大哥在博客园回答我了但是他给的解决方法是将循环对象的类型转换为列表,如果将循环对象改变类型的话,那么其他地方也要加上类型转换,这样就和列表推导式拆解的代码不一样了,(我想要的是将列表推导式完全拆解不改变代码,只改变顺序写成for循环)打断点之后发现列表推导式和for循环的写法完全不一样,列表推导式是执行完循环之后才会将对象加到列表中,而for循环通常写法是每循环一次条件成立就是用append将对象加到列表中,可能是我一开始就将列表推导式和for循环的理解错了(原来以为在这种单个条件判断上只要改变一下顺序两种方式可以完全替换实现同样的效果),现在看来他们在不同的场景不可能用完全一样的代码实现完全一样的效果

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月5日
  • 已采纳回答 10月28日
  • 创建了问题 10月21日

悬赏问题

  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码