Python:修改For循环中的列表

时间:2016-05-20 04:43:45

标签: python

我正在尝试创建卡片游戏模拟以提高我的编程技能,我遇到了以下问题:

我将卡片放在一个大清单中,我使用下一个功能来挑选卡片并将其从卡片中移除。

cards= [........(big list of cards here in string format).......]
def Pickacard(x):
    rand=random.randint(0,len(x)-1)
    t=int(x[rand])
    del(x[rand])
    return t

当我使用下面的迭代时,牌组不会更新。相反,每次卡被挑选时,牌组仍然会缩短1个项目,尽管在每个循环中我都设置了“test = cards”,以便将列表设置回原始值。

for i in range(200):
    test=cards
    Pickacard(test)
    print(test)

Deck有208张牌,如果牌组更新,那么(打印测试)会给我一张207张牌的清单。相反,我得到了8张牌的清单。我虽然只有在...... test = cards ....不在循环中才会发生这种情况。

3 个答案:

答案 0 :(得分:2)

致电test = cards时,您未复制cards中的列表test。实际上,您所做的只是将指针test复制到cards。所以他们指向同一个名单。这就是为什么列表不断缩小,永远不会更新。

如果您想更新它,您有几种可能性。您可以使用以下内容创建列表的副本:

  • test = cards[:]切片(不是最好的方法)
  • 使用list()test = list(copy)
  • 创建
  • 明确副本:test = copy.copy(cards)(必须先导入模块copy

否则,您可以保存已删除的卡,并在循环结束时重新插入。这避免了在每次迭代时复制列表。虽然在你的情况下并不重要,但通过避免不必要的计算来思考一些表现是一个好习惯:

def Pickacard(x):
    rand=random.randint(0,len(x)-1)
    card = x[rand]
    del(x[rand])
    return card

for i in range(200):
    card = Pickacard(cards)
    print(cards)
    cards.append(card)

答案 1 :(得分:1)

您正在复制参考,而不是列表数据。请尝试以下选项。

import copy
test = copy.copy(cards) 

OR

test = list(cards)  

另请阅读Deep and Shallow Copy

答案 2 :(得分:1)

在Python中,变量只是对象的别名。所以在你的程序中,testcards是同一个对象的两个别名。因此,当您删除cards中的项目时,test也会更改。

如果您希望test成为另一个对象,可以使用

test = cards[:]

这将构建一个包含所有卡片的新列表。

您可以在此处查看有关如何复制列表的详细信息 How to clone or copy a list in Python?