Найти - Пользователи
Полная версия: Проблем в выводе результата при разном создании одинакового списка
Начало » Python для новичков » Проблем в выводе результата при разном создании одинакового списка
1 2
Andruid
При создании списка вот таким deck =
[[''] * 9]*4
вариантом, результирующий список полностью заполнен последним значением списка suits - ‘ of clubs’, если создать список вручную, выводит все нормально, в чем проблема, что сделал не так, выводил пустые списки deck и deck_1 - они полностью идентичны
 suits = [' of hearts', ' of spades', ' of diamonds', ' of clubs']
card_val = ['6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
deck = [[''] * 9]*4
deck_1 = [['','','','','','','','','',],
        ['','','','','','','','','',],
        ['','','','','','','','','',],
        ['','','','','','','','','',]]
for x in range(len(deck)):    
    for y in range(len(card_val)):                        
        deck[x][y] = card_val[y] + suits[x]               
print (deck)
print ('--------------------')
print (deck_1)

Результат
FishHook
Andruid
список - изменяемый объект (погуглите “питон изменяемые и неизменяемые”), это значит, что он всегда передается по ссылке, то есть вот тут
 [[''] * 9]*4
вы создали не список из четырех списков, а список из четырех ссылок на один и тот же список
Andruid
FishHook
вы создали не список из четырех списков, а список из четырех ссылок на один и тот же список
Понятно, а как тогда создать кратко вот такую “болванку” для списка? Если мне нужно будет не 4 на 9, а больше, я замучаюсь эти скобки и кавычки рисовать. Можно как то эту запись deck = [ * 9]*4 сделать, чтобы она работала после создания, как 4 разных списка, а не ссылка на один и тот же?
Palrom
  
deck = [[] for i in range(4)]
 
for x in range(len(deck)):
    for y in range(len(card_val)):
        deck[x].append(card_val[y] + suits[x])

При использовании метода append() и так пойдёт:
 deck_1 = [[], [], [], []]
FishHook
Andruid
я замучаюсь эти скобки и кавычки рисовать
 deck = [[''] * 9 for _ in range(4)]
xam1816
  
suits = [' of hearts', ' of spades', ' of diamonds', ' of clubs']
card_val = ['6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
deck = [f"{v}_{s}" for v in card_val for s in suits]
print(deck)

 
['6_ of hearts', '6_ of spades', '6_ of diamonds', '6_ of clubs', '7_ of hearts', '7_ of spades', '7_ of diamonds', '7_ of clubs', '8_ of hearts', '8_ of spades', '8_ of diamonds', '8_ of clubs', '9_ of hearts', '9_ of spades', '9_ of diamonds', '9_ of clubs', '10_ of hearts', '10_ of spades', '10_ of diamonds', '10_ of clubs', 'Jack_ of hearts', 'Jack_ of spades', 'Jack_ of diamonds', 'Jack_ of clubs', 'Queen_ of hearts', 'Queen_ of spades', 'Queen_ of diamonds', 'Queen_ of clubs', 'King_ of hearts', 'King_ of spades', 'King_ of diamonds', 'King_ of clubs', 'Ace_ of hearts', 'Ace_ of spades', 'Ace_ of diamonds', 'Ace_ of clubs']
ZerG
В питоне не нужно создавать массив определенной длины перед тем как его заполнить по аналогии
с Си и другими языками (кроме отдельных случаев и то там будет кортеж скорее всего)
 suits = [" of hearts", " of spades", " of diamonds", " of clubs"]
card_val = ["6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
deck = []
for cs in suits:
    deck.append([val+cs for val in card_val])
print(deck)
ZerG
xam1816
Опередил. Только подчеркивание лишнее…
Andruid
Спасибо всем за ответы.
Можно ли сделать сделать методом без предопределения списка (таким как
  deck = [f"{v}_{s}" for v in card_val for s in suits] 
или таким как
  deck.append([val+cs for val in card_val])) 
вложенный список? Такими способами список получается одномерным, хотелось бы разделить масти карт в 4 списка и вложить их в список.
ZerG
можно - зачем ваш наш форум?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB