首页 > 解决方案 > 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),恰好是前一个循环的最后一手牌。我不知道为什么会这样。如果有人可以向我解释这种行为,将不胜感激。

标签: python

解决方案


您在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,而不是碰巧返回一个的函数调用。


推荐阅读