Проблема в том, что вы повторно используете один и тот же экземпляр Card
снова и снова и меняете его после того, как он уже добавлен в список. Вы добавили ссылки на одну и ту же карту в список 52 раза и сменили одну и ту же карточку 52 раза. Вот почему он заканчивается в последней комбинации.
ПримечаниеЭтот часть:
def construct(self):
for value in self.card.values:
for suit in self.card.suits:
self.card.construct(value, suit)
self.cards.append(self.card)
print(self.cards) # I added this line
Это то, что print
печатает:
[<__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>, <__main__.Card object at 0x0377DB10>]
Смотрите 0x0377DB10
немного? Это адрес объекта. Обратите внимание, как они все одинаковы! Каждый раз, когда вы вызываете self.card.construct(value, suit)
, вы просто меняете этот единственный экземпляр, включая все ссылки на него, которые уже находятся в self.cards
.
Если вы запускали тест, затем изменил deck.card.suit
, затем снова запускали тест, вы бы увидели, что все карты были одновременно изменены.
Создайте новую карту каждый раз, чтобы вы не переписывали один и тот же экземпляр.
Вот модифицированная версия, которая работает. Обратите внимание, как я создаю новую карту каждый раз, когда:
def construct(self):
for value in self.card.values:
for suit in self.card.suits:
card = Card()
card.construct(value, suit)
self.cards.append(card)
print(self.cards)
Это то, что новая версия печатает:
[<__main__.Card object at 0x0376DB90>, <__main__.Card object at 0x0376DBB0>, <__main__.Card object at 0x0376DBD0>, <__main__.Card object at 0x0376DBF0>, <__main__.Card object at 0x0376DC10>, <__main__.Card object at 0x0376DC30>, <__main__.Card object at 0x0376DC50>, <__main__.Card object at 0x0376DC70>, <__main__.Card object at 0x0376DC90>, <__main__.Card object at 0x0376DCB0>, <__main__.Card object at 0x0376DCD0>, <__main__.Card object at 0x0376DCF0>, <__main__.Card object at 0x0376DD10>, <__main__.Card object at 0x0376DD30>, <__main__.Card object at 0x0376DD50>, <__main__.Card object at 0x0376DD70>, <__main__.Card object at 0x0376DD90>, <__main__.Card object at 0x0376DDB0>, <__main__.Card object at 0x0376DDD0>, <__main__.Card object at 0x0376DDF0>, <__main__.Card object at 0x0376DE10>, <__main__.Card object at 0x0376DE30>, <__main__.Card object at 0x0376DE50>, <__main__.Card object at 0x0376DE70>, <__main__.Card object at 0x0376DE90>, <__main__.Card object at 0x0376DEB0>, <__main__.Card object at 0x0376DED0>, <__main__.Card object at 0x0376DEF0>, <__main__.Card object at 0x0376DF10>, <__main__.Card object at 0x0376DF30>, <__main__.Card object at 0x0376DF50>, <__main__.Card object at 0x0376DF70>, <__main__.Card object at 0x0376DF90>, <__main__.Card object at 0x0376DFB0>, <__main__.Card object at 0x0376DFD0>, <__main__.Card object at 0x0376DFF0>, <__main__.Card object at 0x03775030>, <__main__.Card object at 0x03775050>, <__main__.Card object at 0x03775070>, <__main__.Card object at 0x03775090>, <__main__.Card object at 0x037750B0>, <__main__.Card object at 0x037750D0>, <__main__.Card object at 0x037750F0>, <__main__.Card object at 0x03775110>, <__main__.Card object at 0x03775130>, <__main__.Card object at 0x03775150>, <__main__.Card object at 0x03775170>, <__main__.Card object at 0x03775190>, <__main__.Card object at 0x037751B0>, <__main__.Card object at 0x037751D0>, <__main__.Card object at 0x037751F0>, <__main__.Card object at 0x03775210>]
Обратите внимание, как все адреса разные! Сейчас все разные карты.
Когда я запустить тест, я получаю:
2♥ K♥ 3♥ J♥ 6♥ 5♣ 7♣ 7♦ 8♣ 5♦ 3♣ Q♥ 10♣ 9♣ 9♥ A♦ 8♥ 9♠ 6♠ A♠ K♣ K♠ J♦ 2♦ 7♥ 10♠ 6♦ 6♣ 4♠ 5♠ K♦ 3♦ 4♥ 9♦ Q♠ 7♠ A♣ 4♣ 10♦ A♥ Q♦ 4♦ 5♥ J♣ 8♠ 3♠ J♠ Q♣ 8♦ 10♥ 2♣ 2♠
Я хотел бы отметить, однако, что метод construct
ненужно. Он выполняет работу, которую должен выполнять конструктор Card
, но гораздо менее интуитивно понятным способом. Точка конструктора - construct
. Подумайте о состоянии карты, если вы забыли позвонить construct
.Нельзя забывать, если вы просто используете конструктор.
Вы почти наверняка избавитесь от полей 'value',' suite' и 'valit' класса. Не храните произвольную информацию в качестве переменных экземпляра. Верните карточку из 'construct', затем добавьте возвращенную карточку в' cards'. Когда это возможно, передавайте информацию в явном виде на функции и возвращайте информацию из них; не полагайтесь на фоновое состояние объекта. Это, вероятно, не ваша проблема, но ваш код очень запутанно читать. Фиксация, которая может прояснить ситуацию. – Carcigenicate
Вы создаете ТОЧНО один объект '' Card'' в своей программе в '' Deck .__ init __() ''. Затем вы последовательно устанавливаете одну карту для каждой комбинации значений и костюма последовательно. – jasonharper
Carcigenicate point, jasonharper извините меня за то, что я не получил правильную терминологию – soocki