【问题标题】:Why does .pop() eventually stop and not keep removing items from a list until the list is empty? [duplicate]为什么 .pop() 最终会停止并且不会继续从列表中删除项目,直到列表为空? [复制]
【发布时间】:2019-09-28 18:21:18
【问题描述】:

我正在尝试构建一个纸牌游戏手模拟器。 我希望能够洗牌一张卡片列表(我假设是随机导入),然后从牌堆顶部移除卡片并将它们放入我的手中。我想画多久就画多久。

问题是,当我使用 .pop() 执行此操作时,它会从随机列表中删除几行元素,但最终会停止,然后只在列表中留下 2 个项目。当我查看文档时,它说 .pop() 默认情况下会删除位置 0 处的项目,所以我不知道为什么它不继续。

现在我正在尝试使用 .pop() 方法。我是python新手,所以可能有更好的方法,我只是不知道是否有更好的方法。无论如何,我试图理解为什么 .pop() 没有解决这个问题并且文档并没有完全帮助。

    '''the for-loop is supposed to shuffle my cards, and then keep plucking one off of the top until there are no more cards in the deck'''

import random
hand = [1,2,3,4,5]
random.shuffle(hand)
for i in hand:
    card = hand.pop(0)
    print(card)
    print(hand)

我实际得到的: 1 [4、5、3、2] 4 [5, 3, 2] 5 [3, 2]

我想得到什么: 1 [4、5、3、2] 4 [5, 3, 2] 5 [3, 2] 3 [2] 2 []

【问题讨论】:

标签: python random shuffle


【解决方案1】:

一般解释:

您在迭代列表内容的同时修改列表。当你这样做时,坏事就会发生。

稍微更技术性的解释:

for 循环 for i in hand 仅在循环开始时评估 hand 一次。但是每次通过循环时,您都会从列表中删除项目,因此 for 循环的结果现在与列表的当前状态不同步。

试试这个:

import random
hand = [1,2,3,4,5]
random.shuffle(hand)
while hand:
    card = hand.pop(0)
    print(card)
    print(hand)

【讨论】:

  • 谢谢,效果很好。我仍然不总是知道何时使用 for 循环和 while 循环,但我想这只是一种学习体验。
猜你喜欢
  • 1970-01-01
  • 2016-11-27
  • 2015-08-19
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多