我正在尝试创建卡片游戏模拟以提高我的编程技能,我遇到了以下问题:
我将卡片放在一个大清单中,我使用下一个功能来挑选卡片并将其从卡片中移除。
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 ....不在循环中才会发生这种情况。
答案 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)
答案 2 :(得分:1)
在Python中,变量只是对象的别名。所以在你的程序中,test
和cards
是同一个对象的两个别名。因此,当您删除cards
中的项目时,test
也会更改。
如果您希望test
成为另一个对象,可以使用
test = cards[:]
这将构建一个包含所有卡片的新列表。
您可以在此处查看有关如何复制列表的详细信息 How to clone or copy a list in Python?