Python:修改For循环中的列表
我正在尝试创建纸牌游戏模拟,以稍微提高我的编程技能,但我遇到了以下问题: 我有一个大列表中的卡片,我使用下一个函数来选择一张卡片并将其从牌组中移除Python:修改For循环中的列表,python,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 当我使用下面
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)
卡片组有208张卡片,如果卡片组被更新,那么(打印测试)会给我一张207张卡片的列表。相反,我得到了一张8张卡片的清单。我想只有当…测试=卡片…时才会发生这种情况。。。。在循环之外。您复制的是引用,而不是列表数据。尝试以下选项
import copy
test = copy.copy(cards)
或
另外,请阅读您正在复制的是引用,而不是列表数据。尝试以下选项
import copy
test = copy.copy(cards)
或
另外,在调用
test=cards
时,请阅读您没有在test
中复制列表cards
。实际上,您所做的只是将指针test
复制到卡中。因此,它们指向同一个列表。这就是为什么名单不断缩小,而且从未更新
如果你想续借,有几种可能性。您可以创建具有以下内容的列表副本:
- 用
test=cards[:]
(这不是最好的方法)
- 使用
list()
:test=list(复制)
- 显式复制:
test=copy.copy(卡片)
(必须先导入模块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)
调用test=cards
时,您没有在test
中复制列表cards
。实际上,您所做的只是将指针test
复制到卡中。因此,它们指向同一个列表。这就是为什么名单不断缩小,而且从未更新
如果你想续借,有几种可能性。您可以创建具有以下内容的列表副本:
- 用
test=cards[:]
(这不是最好的方法)
- 使用
list()
:test=list(复制)
- 显式复制:
test=copy.copy(卡片)
(必须先导入模块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)
在Python中,变量只是对象的别名。因此,在您的程序中,test
和cards
是同一对象的两个别名。因此,当您删除卡
中的项目时,测试
也会发生变化
如果希望test
成为另一个对象,可以使用
test = cards[:]
这将建立一个包含所有卡片项的新列表
您可以在此处查看有关如何复制列表的更多信息
在Python中,变量只是对象的别名。因此,在您的程序中,test
和cards
是同一对象的两个别名。因此,当您删除卡
中的项目时,测试
也会发生变化
如果希望test
成为另一个对象,可以使用
test = cards[:]
这将建立一个包含所有卡片项的新列表
您可以在此处查看有关如何复制列表的更多信息
尝试复制列表。e、 g.测试=列表(卡片)
。您当前正在做的是传递对同一列表的引用。当你从中删除时。在引用该列表的所有实例中都可以看到更改。请尝试复制该列表。e、 g.测试=列表(卡片)
。您当前正在做的是传递对同一列表的引用。当你从中删除时。在引用该列表的所有实例中都可以看到更改。