python - Python中二维列表的问题
问题描述
昨天,我决定第一次开始玩 Python,所以请放轻松,我几乎没有编程经验。作为我的第一个小项目,我正在尝试编写一个脚本,将一副牌洗牌并从洗好的牌组中处理 5 张牌。我正在尝试将手存储在二维数组/矩阵中。这是我遇到问题的代码:
import random
sorted_deck = ["AH","KH","QH","JH","TH","9H","8H","7H","6H","5H","4H","3H","2H",
"AS","KS","QS","JS","TS","9S","8S","7S","6S","5S","4S","3S","2S",
"AD","KD","QD","JD","TD","9D","8D","7D","6D","5D","4D","3D","2D",
"AC","KC","QC","JC","TC","9C","8C","7C","6C","5C","4C","3C","2C"]
def shuffle():
sorted_deck_current = list()
sorted_deck_current.clear()
sorted_deck_current = sorted_deck.copy()
shuffled_deck = list()
shuffled_deck.clear()
for n in range(0,52):
r = random.randrange( 0, len(sorted_deck_current) )
shuffled_deck.append( sorted_deck_current[r] )
sorted_deck_current.pop( r )
return shuffled_deck
for n in range(2): # Check that the shuffle()-function works
fresh_shuffled = shuffle()
print( "Shuffled deck: " + str(fresh_shuffled) )
many_hands = list()
temp_hand = list()
temp_deck = list()
many_hands.clear()
for n in range(5): # Draw 5 hands from freshly shuffled decks
temp_hand.clear()
temp_deck.clear()
temp_deck = shuffle()
for i in range(5):
temp_hand.append( temp_deck[i] )
many_hands.append( temp_hand )
print( many_hands[n] )
for q in range(5): # Try and output the 5 different hands again
print( many_hands[q] )
exit()
我for n in range(5)
在代码末尾的循环输出了 5 只不同的手,这就是我想要的。循环输出同一手牌 5次for q in range(5)
,恰好是前一个循环的最后一手牌。我不知道为什么会这样。如果有人可以向我解释这种行为,将不胜感激。
解决方案
您在temp_hand
开始第一个for
循环之前创建。此后,您总是会修改同一个对象,然后将其重新添加到many_hands
. 本质上,您只是将同一个对象添加了五次。如果你熟悉 C,这就像 pass-by-reference:python 在追加列表之前不会复制列表的值,它只是追加对列表的引用。
因此,稍后,当您尝试 print 时many_hands
,它会打印相同的对象 5 次。
对此的解决方案是在循环temp_hand
内部for
而不是外部进行初始化,以便每次迭代都重新初始化(到新的引用)。也就是换行
temp_hand.clear()
它会修改您当前拥有的单个列表,而不更改其引用,使用
temp_hand = list()
它在新引用处创建一个新的空列表并将其分配给temp_hand
.
顺便说一句,当您初始化一个空列表时,通常首选使用列表文字(即[]
)而不是构造函数。list()
这主要是因为它从周围的代码中脱颖而出,绝对是一个 list,而不是碰巧返回一个的函数调用。
推荐阅读
- bash - 让 gitlab 工作不等待“脚本”部分的任何返回
- python - 在数据python中用nans计算3个数组的加权平均值
- javascript - 方法测量模拟期间代理未使用的时间
- c# - 我想在 C# 表单应用程序的列表框中打印 C++ 向量的元素
- python - 如何在 Paramiko 库中配置首选密码
- arrays - 在c中访问动态数组的每个元素
- vbscript - 使用 VBScript 递归检查复制项目到新目标的文件和文件夹
- python - 从异常对象中提取完整跟踪
- c++ - 如何使用 CMake 将 Go 代码编译并链接到 c++ 中
- database - 我什么时候应该在普通后端逻辑上使用数据库挂钩?