甲板洗牌算法中的索引超出范围错误
Index out of range error in deck shuffling algorithm
我正在编写 python 版本的棋盘游戏 Onitama,目前我正在尝试编写一个洗牌函数:
temp_deck = onitama_deck.deck
print(temp_deck)
print(len(onitama_deck.deck))
print(len(temp_deck))
for i in range(len(temp_deck)):
next_card = temp_deck[random.randrange(0, len(temp_deck))]
deck.deck[i] = next_card
temp_deck.remove(next_card)
print(onitama_deck.deck)
onitama_deck.deck 和 temp_deck 都是列表,但是当我 运行 程序的牌组包含 1-10 的值时,我得到以下输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
10
10
Traceback (most recent call last):
File "onitama.py", line 33, in <module>
deck.shuffle()
File "onitama.py", line 25, in shuffle
onitama_deck.deck[i] = next_card
IndexError: list assignment index out of range
起初我想知道为什么我太大了,所以我尝试打印两个列表。由于某种原因,每次迭代都会从 temp_deck 中删除最低的奇数,然后将 onitama_deck.deck 设置为等于 temp_deck,如下所示:
iteration: 1
temp_deck: [2, 3, 4, 5, 6, 7, 8, 9, 10]
deck: [2, 3, 4, 5, 6, 7, 8, 9, 10]
iteration: 2
temp_deck: [2, 4, 5, 6, 7, 8, 9, 10]
deck: [2, 4, 5, 6, 7, 8, 9, 10]
iteration: 3
temp_deck: [2, 4, 6, 7, 8, 9, 10]
deck: [2, 4, 6, 7, 8, 9, 10]
iteration: 4
temp_deck: [2, 4, 6, 8, 9, 10]
deck: [2, 4, 6, 8, 9, 10]
iteration: 5
temp_deck: [2, 4, 6, 8, 10]
deck: [2, 4, 6, 8, 10]
然后我得到索引超出范围的错误。无论如何可以解释我逻辑中的缺陷吗?感谢您的帮助。
问题是 temp_deck
不是牌组的副本,而是对 相同 牌组的引用:
temp_deck = onitama_deck.deck
要制作副本,您可以将其更改为:
temp_deck = list(onitama_deck.deck)
我正在编写 python 版本的棋盘游戏 Onitama,目前我正在尝试编写一个洗牌函数:
temp_deck = onitama_deck.deck
print(temp_deck)
print(len(onitama_deck.deck))
print(len(temp_deck))
for i in range(len(temp_deck)):
next_card = temp_deck[random.randrange(0, len(temp_deck))]
deck.deck[i] = next_card
temp_deck.remove(next_card)
print(onitama_deck.deck)
onitama_deck.deck 和 temp_deck 都是列表,但是当我 运行 程序的牌组包含 1-10 的值时,我得到以下输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
10
10
Traceback (most recent call last):
File "onitama.py", line 33, in <module>
deck.shuffle()
File "onitama.py", line 25, in shuffle
onitama_deck.deck[i] = next_card
IndexError: list assignment index out of range
起初我想知道为什么我太大了,所以我尝试打印两个列表。由于某种原因,每次迭代都会从 temp_deck 中删除最低的奇数,然后将 onitama_deck.deck 设置为等于 temp_deck,如下所示:
iteration: 1
temp_deck: [2, 3, 4, 5, 6, 7, 8, 9, 10]
deck: [2, 3, 4, 5, 6, 7, 8, 9, 10]
iteration: 2
temp_deck: [2, 4, 5, 6, 7, 8, 9, 10]
deck: [2, 4, 5, 6, 7, 8, 9, 10]
iteration: 3
temp_deck: [2, 4, 6, 7, 8, 9, 10]
deck: [2, 4, 6, 7, 8, 9, 10]
iteration: 4
temp_deck: [2, 4, 6, 8, 9, 10]
deck: [2, 4, 6, 8, 9, 10]
iteration: 5
temp_deck: [2, 4, 6, 8, 10]
deck: [2, 4, 6, 8, 10]
然后我得到索引超出范围的错误。无论如何可以解释我逻辑中的缺陷吗?感谢您的帮助。
问题是 temp_deck
不是牌组的副本,而是对 相同 牌组的引用:
temp_deck = onitama_deck.deck
要制作副本,您可以将其更改为:
temp_deck = list(onitama_deck.deck)