在列表中创建两个对象副本

时间:2015-04-22 00:16:33

标签: python class duplicates

我一直渴望弄明白这一点,但我似乎可以'似乎让它发挥作用。

我有一个名为Deck的课程:

import random
class Deck(list):
'''
a list of cards represented in a deck
'''
def __init__(self):
    ''' a list of cards'''
    list.__init__(self)
    for i in range(52):
        self.append(Card(i))

def isEmpty(self):
    '''checks if Deck is empty or not; returns T or F'''
    return self(len) == 0

def shuffle(self):
    ''' shuffles the list of cards in random order'''
    return random.shuffle(self)

def deal(self, num):
    '''creates a new list of cards from the deck.
    Arguments:
        num = an integer to assign how many cards to deal
    Returns:
        a new list of cards taken from the deck
    '''
    new = []
    for i in range(num):
        x = self.pop(0)                    #something to note, if instead "x = self.pop(i)"
        new.append(x)                      #it will only take even card, and leave out odd cards
    return new

def restore(self, lst):
    '''restores the cards already taken from Deck
    Arguments:
        lst = a list of cards pulled out from Deck
    Returns:
        nothing; returns cards to the Deck
    '''
    while len(lst) > 0:
        x = lst.pop(0)
        self.append(x)

Class Deck是一个对象卡列表,它派生自名为Card的类。

现在我必须创建一个名为PinochleoDeck的类:

class PinochleDeck(Deck):

    def __init__(self):
        Deck.__init__(self)
        x = 0
        for i in range(4):
            for i in range(7):
                self.pop(x)
            x += 6

它应该只能从所有套装的9到Ace获得套牌,这是24张牌。 但我还要制作所有卡片的两份副本,因此总共有48张卡片作为PinochleoDeck类。

我已经尝试了很多东西,比如itertools,copy,甚至是粗暴的乘法,但它们都没有奏效。如何在不创建新列表的情况下在列表中创建两个对象副本,以便PinocheloDeck类有48张卡?

由于

2 个答案:

答案 0 :(得分:1)

在我看来,你只是在第一次只删除了一些卡片。要获得所有28张卡的一份副本,您需要在PinochleDeck类中添加一个新行。见下文:

class PinochleDeck(Deck):

    def __init__(self):
        Deck.__init__(self)
        x = 0
        for i in range(4):
            for i in range(7):
                self.pop(x)
                x += 1  #NEED TO INCREMENT EVERY TIME THROUGH!!!
            x += 6

要获得每份的两份副本,你可以这样做:

class PinochleDeck(Deck):

    def __init__(self):
        Deck.__init__(self)
        x = 0
        for i in range(4):
            for i in range(7):
                self.pop(x)
                x += 1  #NEED TO INCREMENT EVERY TIME THROUGH!!!
            x += 6
        self.extend(self)

现在,这只有在你不关心同一个实例的多个副本时才会起作用(即你的牌不会改变,所以俱乐部的ace总是看起来完全一样)。如果您需要能够在不相互踩踏的情况下进行修改的副本,您需要在每张卡片上执行deepcopy或使用Deck课程{{1}退出}。我会选择:

__init__

答案 1 :(得分:0)

如果您有一个Card对象列表,则需要对列表进行深度查看:

 from copy import deepcopy

要将它们添加到原始列表,请使用extend:

 your_list.extend(deepcopy(your_list))

您也无法调用自我self(len)