Python石头剪刀布项目:如何实现列表内分数变量自增后同步更新
为啥你的分数列表一直不更新
这个现象完全是Python的类型存储规则导致的,和你预期的逻辑偏差来自两点:
- 整数属于Python的不可变类型,当初你写
score = [ai_score, player_score]的时候,程序根本没有把ai_score、player_score这两个变量本身装进列表,只是把两个变量当时存的整数值(初始都是0)拷了一份,做成列表的两个独立元素存了起来。 - 后面你对
ai_score、player_score做自增的时候,改的是这两个独立变量绑定的新值,和之前已经拷进列表的那两个0没有任何关系,所以不管你加多少分,列表打印出来永远是初始的[0,0]。
直接答你最关心的问题:对于整数这类不可变类型,根本没法实现“把变量存进列表后,改变量的值列表跟着变”的效果,因为列表存的是当时的值副本,不是变量本身的动态引用。
怎么改就能正常用了
改法1:直接用列表存分数,别单独搞两个独立分数变量
这是最贴合你“用[ai_score, player_score]格式列表存分数”需求的写法,完全不会有不同步的问题:
- 初始化的时候直接写
score = [0, 0],定好规则:score[0]是AI的得分,score[1]是你的得分。 - 代码里所有原来写
ai_score +=1的地方,换成score[0] +=1;所有原来写player_score +=1的地方,换成score[1] +=1。 - 每轮打完直接打印
score,拿到的就是最新的实时分数,不用额外做同步操作。
改法2:如果就是想保留独立的分数变量,就手动同步列表
要是你确实想单独维护ai_score、player_score这两个变量,只需要在每轮所有加分逻辑跑完之后,手动把最新的两个值更新到列表的对应位置就行:
在每轮的加分逻辑全部执行完之后,追加两行同步代码:
score[0] = ai_score score[1] = player_score这种写法虽然能跑出正确结果,但多了一步冗余的同步操作,远不如第一种改法简洁。
内容的提问来源于stack exchange,提问作者m3.b
相关产品推荐
相关产品推荐

