为何双列表构建的字典所有键对应值均为100?代码逻辑解析
问题解析:为何字典所有键的值均为100?
先看你的代码及运行结果:
list_of_trees = list(range(50, 450, 50)) results_list = [2*trees for trees in list_of_trees] results_my = {} for trees in list_of_trees: for result in results_list: results_my[trees] = result break print(results_my) >> {50: 100, 100: 100, 150: 100, 200: 100, 250: 100, 300: 100, 350: 100, 400: 100}
逐步拆解赋值逻辑
初始化列表:
list_of_trees生成的是[50, 100, 150, 200, 250, 300, 350, 400]results_list是列表推导式生成的[100, 200, 300, 400, 500, 600, 700, 800],每个元素对应list_of_trees元素的2倍,这部分逻辑没问题。
嵌套循环的执行逻辑:
- 外层循环:依次遍历
list_of_trees中的每个元素(从50到400) - 内层循环:每次进入内层循环,只取
results_list的第一个元素(也就是100),执行results_my[trees] = result赋值后,立刻用break跳出内层循环。 - 也就是说,不管外层循环当前遍历到哪个
trees值,内层循环都只执行一次,且永远取results_list的第一个元素赋值。
- 外层循环:依次遍历
举个具体执行步骤的例子:
- 第一次外层循环:
trees=50,内层循环取result=100,赋值后break,此时results_my是{50:100} - 第二次外层循环:
trees=100,内层循环还是取result=100,赋值后break,此时results_my变成{50:100, 100:100} - 后续每一次外层循环都是重复这个操作,最终所有键对应的值都是100。
正确的实现方式(用zip)
如果你想让每个trees对应results_list中位置匹配的值,用zip()是最简洁的方式:
results_my = dict(zip(list_of_trees, results_list)) # 输出会是 {50: 100, 100: 200, 150: 300, ..., 400: 800}
内容的提问来源于stack exchange,提问作者Matěj Prudil
相关产品推荐
相关产品推荐

