Python编写板球计分卡时overs列表仅显示最后一局数据问题
板球两局计分卡列表赋值bug原因说明
问题本质
你遇到的第一局得分丢失、最终输出出现空列表的问题,核心原因是重置单局列表和追加总列表的顺序写反了,导致你追加到总列表overs里的始终是空列表,而非已经录入完6个球得分的完整单局数据。
原代码执行逻辑拆解
我们以第一次触发单局结束条件(第6个球打完,ball=5,ball+1=6满足整除6的判断)为例,原代码if块内的执行顺序是:
- 第一步:执行
new_over = list(),直接把new_over变量绑定到一个全新的空列表,之前存了6个第一局得分的列表没有被任何变量引用,直接被内存回收,第一局数据就此丢失。 - 第二步:执行
overs.append(new_over),此时追加进去的是刚创建的空列表,不是第一局的得分数据。 - 后续循环录入第二局得分时,所有得分都会被append到这个已经被放进
overs的空列表里,所以你看到overs的第一个元素最后变成了第二局的6个得分。 - 等第12个球打完第二次触发if判断时,同样先创建新空列表再追加,最终
overs的第二个元素就是空列表,和你遇到的错误输出[[2,4,0,1,0,6],[]]完全吻合。
调换顺序后生效的原因
把new_over = list()移动到overs.append(new_over)之后,if块的执行逻辑就符合业务需求了:
- 单局6个球打完时,
new_over里已经存满了当前局的所有得分,先执行追加操作,把完整的单局得分列表存入总列表overs。 - 再创建新的空列表赋值给
new_over,用来存下一局的得分,这时候新的空列表和已经存入overs的上一局数据完全独立,不会互相影响。
修正后可正常运行的代码
import random runs = random.choices([0, 1, 2, 3, 4, 5, 6], weights = [30, 30, 20, 5, 10, 0, 5], k = 12) overs = list() new_over = list() for ball, run in enumerate(runs): new_over.append(run) if (ball + 1) % 6 == 0: overs.append(new_over) new_over = list() print(overs)
运行后就会输出你预期的两局嵌套列表结构,格式类似[[1,0,0,4,2,6],[2,4,0,1,0,6]]。
内容的提问来源于stack exchange,提问作者Janardhan Kanisetti
相关产品推荐
相关产品推荐

