#python #list #methods
#python #Список #методы
Вопрос:
В настоящее время я пытаюсь закодировать Uno на python для моего школьного курса по основам информатики, и я создал определение для вытягивания карт из колоды в руку игрока, и всякий раз, когда я запускаю код, я продолжаю получать эту ошибку. Мне просто было интересно, как это исправить, потому что я попробовал пару вещей и ничего не добился.
Я пробовал добавлять предметы в руку игрока (которая начинается с пустого). Я пытался использовать кортежи. Я пробовал использовать преобразование переменной рисования в список. x
определяет, у какого игрока это рука, в то время как y
— сколько они вытягивают и z
— какие карты в колоде.
import random
import time
import sys
def draw_cards(x,y,z):
for q in range(y):
draw = random.choice(z)
x = x.insert(0,draw)
z = z.remove(draw)
return x,z
cards_in_deck = ["red 0","red 1", "red 2", "red 3", "red 4", "red 5","red 6","red 7", "red 8", "red 9", "red skip", "red reverse","red 2","wild","yellow 0","yellow 1", "yellow 2", "yellow 3", "yellow 4", "yellow 5","yellow 6","yellow 7", "yellow 8", "yellow 9", "yellow skip", "yellow reverse","yellow 2","wild","green 0","green 1", "green 2", "green 3", "green 4", "green 5","green 6","green 7", "green 8", "green 9", "green skip", "green reverse","green 2","wild","blue 0","blue 1", "blue 2", "blue 3", "blue 4", "blue 5","blue 6","blue 7", "blue 8", "blue 9", "blue skip", "blue reverse","blue 2","wild","red 1", "red 2", "red 3", "red 4", "red 5","red 6","red 7", "red 8", "red 9", "red skip", "red reverse","red 2","wild 4","yellow 1", "yellow 2", "yellow 3", "yellow 4", "yellow 5","yellow 6","yellow 7", "yellow 8", "yellow 9", "yellow skip", "yellow reverse","yellow 2","wild 4","green 1", "green 2", "green 3", "green 4", "green 5","green 6","green 7", "green 8", "green 9", "green skip", "green reverse","green 2","wild 4","blue 1", "blue 2", "blue 3", "blue 4", "blue 5","blue 6","blue 7", "blue 8", "blue 9", "blue skip", "blue reverse","blue 2","wild 4"]
player_hand = []
ai_dusty_hand = []
ai_cutie_hand = []
ai_smooth_hand= []
draw_cards(ai_dusty_hand,7,cards_in_deck)
draw_cards(ai_cutie_hand,7,cards_in_deck)
draw_cards(ai_smooth_hand,7,cards_in_deck)
draw_cards(player_hand,7,cards_in_deck)
Я ожидал, что результатом будет то, что у каждого игрока будет стартовая рука, но вывод заканчивается ошибкой,
Комментарии:
1. Опубликованный код никогда не пытается использовать метод
len
для чего-либо, поэтому неясно, откуда берется эта ошибка.
Ответ №1:
Списки в Python изменчивы. Таким образом, когда вы манипулируете списком (даже в пределах области действия функции), это будет отражаться везде, где есть ссылка на этот список.
x = x.insert(0,draw)
z = z.remove(draw)
Эти строки кода присваивают возврат вызовов метода из списка. Оба этих вызова метода ничего не возвращают (следовательно, они возвращают None
).
Удалите назначения списков в вашей функции.
Комментарии:
1. Следовательно, решение состоит в том, чтобы удалить оператор присваивания из вызовов, верно? Вы упомянули, что было не так, но не как это устранить.
Ответ №2:
Проблема возникает из этих двух строк, потому что remove не возвращает список :
x = x.insert(0, draw)
z = z.remove(draw)
insert
и remove
ничего не возвращают. Не переназначайте x
и z
, и это должно сработать:
x.insert(0, draw)
z.remove(draw)
Кроме того, вы должны вернуться z
, чтобы сохранить оставшиеся карточки:
def draw_cards(x,y,z):
for q in range(y):
draw = random.choice(z)
x.insert(0,draw)
z.remove(draw)
return z
cards_in_deck = draw_cards(ai_dusty_hand,7,cards_in_deck)
cards_in_deck = draw_cards(ai_cutie_hand,7,cards_in_deck)
cards_in_deck = draw_cards(ai_smooth_hand,7,cards_in_deck)
cards_in_deck = draw_cards(player_hand,7,cards_in_deck)
Комментарии:
1. По этому токену у
insert
вызова также не должно быть присваивания, поэтому это дополнительно нужно будет удалить, поскольку метод ничего не возвращает.2. Спасибо за вашу помощь!