Почему 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] вы говорите, чтобы вернуть только первый элемент во весь список.

  • Фильтрация списков: понимание списка по сравнению с lambda + filter
  • Определите дубликаты в списке списков и суммируйте их последние позиции
  • Любопытное поведение списков Python
  • Python объединяет массивы различных размеров, хранящиеся в списке
  • Python: найдите список в составе членов другого списка (в порядке)
  • Python: поиск идентичных элементов в нескольких списках
  • Сравнить список в python для определения равенства
  • Нечувствительный к регистру 'in' - Python
  • Python - лучший язык программирования в мире.