Почему x = x где x – список списков?

Я работаю над списком списков, и доступ к столбцам очень запутан.

Предположим, что x определяется следующим образом:

x = [[int(np.random.rand()*100) for i in xrange(5)] for x in xrange(10)] pprint.pprint(x) 
 [[86, 92, 95, 78, 68], [76, 80, 44, 30, 73], [48, 85, 99, 35, 14], [3, 84, 50, 39, 47], [3, 7, 67, 28, 65], [19, 13, 98, 53, 33], [9, 97, 35, 25, 89], [48, 3, 48, 5, 1], [21, 40, 72, 61, 62], [58, 43, 84, 69, 26]] 

Теперь оба x[1][:] и x[:][1] дают тот же результат:

 [76, 80, 44, 30, 73] 

Может кто-нибудь объяснить, почему? спасибо

3 Solutions collect form web for “Почему x = x где x – список списков?”

Поведение довольно просто понять, если разбить две операции индексирования каждого из ваших выражений на отдельные части.

  • x[1] будет вторым значением из вашего списка списков (список [76, 80, 44, 30, 73] ).
  • x[1][:] – это копия x[1] (срез, охватывающий весь список).
  • x[:] является (неглубокой) копией x (список списков).
  • x[:][1] – второе значение из скопированного списка списков, который является тем же объектом, что и x[1] .

Итак, два выражения работают равными. Обратите внимание, что поскольку первое выражение копирует список (с фрагментом [:] в конце), они не являются одновременно одним и тем же объектом ( x[1][:] is x[:][1] будет False ).

Если вы использовали массив 2D numpy, вы получите другое поведение, так как вы можете нарезать произвольные размеры (используя несколько иной синтаксис):

 import numpy as np x = np.array([[86, 92, 95, 78, 68], [76, 80, 44, 30, 73], [48, 85, 99, 35, 14], [3, 84, 50, 39, 47], [3, 7, 67, 28, 65], [19, 13, 98, 53, 33], [9, 97, 35, 25, 89], [48, 3, 48, 5, 1], [21, 40, 72, 61, 62], [58, 43, 84, 69, 26]]) print(x[1,:]) # prints the values of the second row: [76 80 44 30 73] print(x[:,1]) # prints the values of the second column: [92 80 85 84 7 13 97 3 40 43] 

Это может быть то, что вы искали.

x[:][1] – это целая строка массива 1 и x[1][:] – все строки 1 x поэтому оба они указывают на одну и ту же строку.

 In [2]: x[:] Out[2]: [[86, 92, 95, 78, 68], [76, 80, 44, 30, 73], [48, 85, 99, 35, 14], [3, 84, 50, 39, 47], [3, 7, 67, 28, 65], [19, 13, 98, 53, 33], [9, 97, 35, 25, 89], [48, 3, 48, 5, 1], [21, 40, 72, 61, 62], [58, 43, 84, 69, 26]] In [3]: x[1] Out[3]: [76, 80, 44, 30, 73] In [4]: x[1][:] Out[4]: [76, 80, 44, 30, 73] 

Использование x[:] часто используется, если вы хотите сохранить копию x в переменной, а не просто ссылку на нее:

 In [6]: x1 = x[:] In [7]: x1 Out[7]: [[86, 92, 95, 78, 68], [76, 80, 44, 30, 73], [48, 85, 99, 35, 14], [3, 84, 50, 39, 47], [3, 7, 67, 28, 65], [19, 13, 98, 53, 33], [9, 97, 35, 25, 89], [48, 3, 48, 5, 1], [21, 40, 72, 61, 62], [58, 43, 84, 69, 26]] 

Создание копии:

 In [11]: x1 = x[:] In [12]: id(x1) # different objects so different id's Out[12]: 140130415845104 In [13]: id(x) Out[13]: 140130400510176 

Создание ссылки:

 In [14]: x1 = x In [15]: id(x) # same object so same id's Out[15]: 140130400510176 In [16]: id(x1) Out[16]: 140130400510176 

x[1][:] говорит сначала получить x[1] который является первым объектом в списке. В этом случае это список. Затем, добавив [:] к этому, вы говорите, чтобы вернуть все объекты списка из этого первого списка. Таким образом, он возвращает весь первый объект списка из вашего основного списка списков.

x[:][1] сначала говорит x[:] чтобы вернуть весь список. Затем, добавив [1] вы говорите, чтобы вернуть только первый элемент во весь список.

  • если i! = 0 в понимании списка дает синтаксическую ошибку
  • Прочитайте файл .txt и поместите элементы в список (Python)
  • изменение элемента в списке списков
  • Список вопросов на Python
  • python - получить список первого индекса кортежей?
  • Как бы вы сделали строку, разделенную запятыми, из списка?
  • Преобразование списка Python
  • Каков самый быстрый способ добавить данные в список без дублирования в python (2.5)
  • Сравнение двух списков для поиска большего списка
  • list.extend и понимание списка
  • Найти начальные и конечные индексы подсписок в списке
  •  
    Interesting Posts for Van-Lav

    Существует ли платформа Open Source для создания настольных приложений, работающих в браузере?

    Получение Chrome для запуска через Selenium

    Python (pandas): удаление дубликатов на основе двух столбцов, содержащих строку с максимальным значением в другом столбце

    IronPython: EXE, скомпилированный с использованием pyc.py, не может импортировать модуль «os»

    Не удалось добавить каталог Django-Assets / Webassets для поиска файлов assets.py

    Как использовать одну и ту же строку кода во всех функциях?

    как получить уведомление об оплате с помощью django-paypal

    добавление шума к сигналу в python

    Как обрабатывать проект по поляне со многими окнами

    Как вы рассчитываете наибольшее количество повторений в списке?

    Модель Django "не объявляет явную строку app_label"

    Входной элемент django error css class

    значения python nan и inf

    Python & Cross позволяет записывать диски на Linux, Windows и Mac

    Каков наилучший способ сделать мелкую копию словаря Python?

    Python - лучший язык программирования в мире.