为什么我的列表会打印出所有其他元素?

时间:2016-02-23 01:23:00

标签: python list

所以,我想设计一个小文件,其中包含一个较大的纸牌游戏卡的所有功能,但当我退回手牌时,它从中拉出卡片显示其他每张卡片,而不是顶部{{ 1}}

x

当我在洗牌后打印出手牌时,说我打电话给hand = [] cards = [(list of all the cards, it is long)] def draw(deck, num): print("You draw %s cards from the top of the deck.") % (str(num)) for x in range(num): drawn_cards = deck.pop(x) add_cards = hand.append(drawn_cards) return drawn_cards return add_cards 这个函数它应该删除前5张牌然后将它们附加到手牌上,但它每隔一张牌附加5张

例如,牌组被洗牌,前10名看起来像这样:

draw(cards, 5)

当我打印我的手时,它看起来像这样:

Ace of Diamonds,
Ace of Hearts,
Seven of Hearts,
Eight of Hearts,
Ten of Hearts,
King of Diamonds,
Nine of Diamonds,
Three of Hearts,
Four of Diamonds,
Two of Spades

每隔一张卡就是5张,我需要前5张牌。为什么这样做?

4 个答案:

答案 0 :(得分:1)

pop(x)不仅会返回列表中索引x处的元素,还会将其从列表中删除。

更好的方法是:

def draw(deck, num):
    print("You draw %s cards from the top of the deck.") % (str(num))
    hand = []
    count = 0
    while count < num:
        card = deck.pop(0) #always take the top card off the deck
        hand.append(card)
    return hand

请注意,每次都会从套牌列表中删除元素。此外,每次调用绘图时,都会创建一个新手。

答案 1 :(得分:0)

这是因为你在增加索引时会从列表中删除。您pop第一个元素,所以前第二个元素成为第一个元素,之前第三个元素成为第二个元素,然后增加循环变量并弹出第二个元素,现在是第三个元素。这会跳过原来的第二个元素,依此类推。

要么只访问元素:

drawn_card = deck[x]

或修改它,但总是pop第一个元素。

一次访问前五个元素的另一种方法:

hand = deck[:5]

此外,处理list.append()的返回值没有意义;它总是None

答案 2 :(得分:0)

这是因为你在循环中使用了deck.pop(x)。这将首先弹出第0个元素,然后是第2个元素,然后是第4个元素,等等。因为每次删除一个元素只会给你第二张卡片。此外,如果您尝试弹出超过一半大小的牌组,此代码将会中断。

您只需要将deck.pop(x)替换为deck.pop(),此代码即可正常工作。

答案 3 :(得分:0)

添加卡片为空,因为追加返回无。在python中尝试这样的东西:

a = [1, 2, 3]
a.append(4)
b = a.append(4)

b将等于无。您还连续有两个return语句。你的第二份退货声明永远不会发生。

最后,解释跳绳动态。在绘制时,你正在弹出你的套牌。尝试一个较小的实验:

lst = [1, 2, 3, 4, 5, 6]
for x in xrange(2):
    print(lst.pop(x))

当您弹出第0个元素时,lst变为:

[2,3,4,5,6]

所以lst.pop(1)会弹出3而不是两个!这就是为什么迭代你正在影响每个动作的事情不是一个好主意。