Python: список списков

Запуск кода

listoflists = [] list = [] for i in range(0,10): list.append(i) if len(list)>3: list.remove(list[0]) listoflists.append((list, list[0])) print listoflists 

возвращается

  • Python, многократная печать,
  • сделать словарь с дубликатными ключами в python
  • ошибка при использовании многопоточности и mysqldb
  • Внедрение кометы / сервера в Google App Engine в Python
  • Миграция с Google App Engine на Heroku (отсутствует YAML)
  • Подсчет повторяющихся символов в строке в Python
  •  [([7, 8, 9], 0), ([7, 8, 9], 0), ([7, 8, 9], 0), ([7, 8, 9], 1), ([7, 8, 9], 2), ([7, 8, 9], 3), ([7, 8, 9], 4), ([7, 8, 9], 5), ([7, 8, 9], 6), ([7, 8, 9], 7)] 

    так почему-то первый аргумент каждого кортежа (списка) обновляется каждый раз в списке списков, но второй список аргументов [0] – нет. Может ли кто-нибудь объяснить, что здесь происходит, и предложить способ исправить это? Я хотел бы вывести

     [([0],0), ([0,1],0), ... 

  • Простая, кросс-платформенная MIDI-библиотека для Python
  • Найдите, где установлен python (если он не является стандартным dir)
  • Присоединение строк. Понимание генератора или списка?
  • проблемы с psycopg2 на движке Google Apps
  • Упаковка и отправка библиотеки и скриптов python, профессиональный способ
  • Почему python выводит информацию о версии на stderr?
  • 6 Solutions collect form web for “Python: список списков”

    Списки являются изменяемым типом – для создания копии (а не просто прохождения одного и того же списка) вам нужно сделать это явно:

      listoflists.append((list[:], list[0])) 

    Однако list уже является именем встроенного Python – было бы лучше не использовать это имя для вашей переменной. Вот версия, которая не использует list в качестве имени переменной и делает копию:

     listoflists = [] a_list = [] for i in range(0,10): a_list.append(i) if len(a_list)>3: a_list.remove(a_list[0]) listoflists.append((list(a_list), a_list[0])) print listoflists 

    Обратите внимание, что я продемонстрировал два разных способа сделать копию списка выше: [:] и list() .

    Первый, [:] , создает срез (обычно часто используемый для получения только части списка), который, как оказалось, содержит весь список и, следовательно, является фактически копией списка.

    Второй, list() , использует фактический конструктор типа list для создания нового списка, который имеет содержимое, равное первому списку. (Я не использовал его в первом примере, потому что вы переписывали это имя в своем коде, что является хорошим примером того, почему вы не хотите этого делать!)

    Во-первых, я настоятельно рекомендую переименовать list переменных в другое. list – это имя встроенного конструктора списков, и вы скрываете его нормальную функцию. Я переименую list в следующем.

    Имена Python – это ссылки , привязанные к объектам. Это означает, что, если вы не создаете несколько списков, всякий раз, когда вы используете его, он ссылается на тот же фактический объект списка, что и в последний раз. Поэтому, когда вы звоните

     listoflists.append((a, a[0])) 

    вы можете позже изменить a и он изменит то, на что указывает первый элемент этого кортежа. Это не происходит с a[0] потому что объект (который является целым числом), на который указывает a[0] , не изменяется (хотя a[0] указывает на разные объекты во время запуска вашего кода).

    Вы можете создать копию всего списка a используя конструктор list :

     listoflists.append((list(a), a[0])) 

    Или вы можете использовать нотацию фрагмента для создания копии:

     listoflists.append((a[:], a[0])) 

    Я пришел сюда, потому что я новичок в python и ленив, поэтому я искал пример для создания списка из 2 списков, через некоторое время понял, что тема здесь может быть неправильной … это код для создания списка списков :

     listoflists = [] for i in range(0,2): sublist = [] for j in range(0,10) sublist.append((i,j)) listoflists.append(sublist) print listoflists 

    это вывод [[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9)], [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9)]]

    Проблема с вашим кодом, похоже, заключается в том, что вы создаете кортеж со своим списком и получаете ссылку на список вместо копии. То, что я думаю, должно подпадать под тему кортежа …

    Переменная списка (которую я бы рекомендовал переименовать в нечто более разумное) является ссылкой на объект списка, который можно изменить.

    На линии

     listoflists.append((list, list[0])) 

    Вы фактически добавляете ссылку на ссылку на объект переменной списка. У вас есть несколько возможностей для создания копии списка, поэтому listoflists содержит значения, которые вы ожидаете:

    Использовать библиотеку копирования

     import copy listoflists.append((copy.copy(list), list[0])) 

    использовать нотацию среза

     listoflists.append((list[:], list[0])) 

    Когда вы запускаете код

     listoflists.append((list, list[0])) 

    Вы не (как я думаю, вы ожидаете) добавили копию list в конец listoflists . То, что вы делаете, это добавить ссылку на list в конец listoflists . Таким образом, каждый раз, когда вы обновляете list , он обновляет каждую ссылку на list , который в этом случае является каждым элементом listoflists

    Вместо этого вы можете сделать следующее:

     listoflists = [] for i in range(1, 10): listoflists.append((range(i), 0)) 

    Вы также не сможете получить вывод, на который вы надеетесь, до тех пор, пока вы добавляете listoflists только внутри if-clause.

    Попробуйте что-то вроде этого:

     import copy listoflists = [] list = [] for i in range(0,10): list.append(i) if len(list)>3: list.remove(list[0]) listoflists.append((copy.copy(list), copy.copy(list[0]))) print(listoflists) 
    Python - лучший язык программирования в мире.