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日

悬赏问题

  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 这个公式写进SIMULINK中的function模块的代码中应该是什么样的
  • ¥15 javaweb登陆的网页为什么不能正确连接查询数据库
  • ¥15 数学建模数学建模需要
  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥20 nao机器人语音识别问题
  • ¥15 怎么生成确定数目的泊松点过程
  • ¥15 layui数据表格多次重载的数据覆盖问题