В чем разница между li = [0] * 10 и li = [set ()] * 10 [duplicate]

Нотация нарезания питона:

a[start:end:step]
  • Для start и end отрицательные значения интерпретируются как относящиеся к концу последовательности.
  • Положительные индексы для end указывают положение после последнего элемента, который должен быть включен.
  • Пустые значения по умолчанию заданы следующим образом: [+0:-0:1].
  • Использование отрицательный шаг отменяет интерпретацию start и end

. Обозначение распространяется на (numpy) матрицы и многомерные массивы. Например, чтобы разрезать целые столбцы, вы можете использовать:

m[::,0:2:] ## slice the first two columns

В срезах хранятся ссылки, а не копии элементов массива. Если вы хотите сделать отдельную копию массива, вы можете использовать deepcopy() .

24
задан Carl 14 July 2012 в 21:09
поделиться

7 ответов

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

    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 type для создания нового списка, который имеет содержимое, равное первому списку. (Я не использовал его в первом примере, потому что вы переписывали это имя в свой код, что является хорошим примером того, почему вы этого не хотите!) [/ ​​G6]

37
ответ дан Amber 4 September 2018 в 10:17
поделиться

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

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

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]))
12
ответ дан Greg Hewgill 4 September 2018 в 10:17
поделиться

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

В строке

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

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

Использовать библиотеку копий

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

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

listoflists.append((list[:], list[0]))
3
ответ дан kajk 4 September 2018 в 10:17
поделиться

Путешественник по времени здесь

List_of_list =[([z for z in range(x-2,x+1) if z >= 0],y) for y in range(10) for x in range(10)]

Это должно сделать трюк. И вывод следующий:

[([0], 0), ([0, 1], 0), ([0, 1, 2], 0), ([1, 2, 3], 0), ([2, 3, 4], 0),  ([3, 4, 5], 0), ([4, 5, 6], 0), ([5, 6, 7], 0), ([6, 7, 8], 0), ([7, 8, 9], 0), ([0], 1), ([0, 1], 1), ([0, 1, 2], 1), ([1, 2, 3], 1), ([2, 3, 4], 1), ([3, 4, 5], 1), ([4, 5, 6], 1), ([5, 6, 7], 1), ([6, 7, 8], 1), ([7, 8, 9], 1), ([0], 2), ([0, 1], 2), ([0, 1, 2], 2), ([1, 2, 3], 2), ([2, 3, 4], 2), ([3, 4, 5], 2), ([4, 5, 6], 2), ([5, 6, 7], 2), ([6, 7, 8], 2), ([7, 8, 9], 2), ([0], 3), ([0, 1], 3), ([0, 1, 2], 3), ([1, 2, 3], 3), ([2, 3, 4], 3), ([3, 4, 5], 3), ([4, 5, 6], 3), ([5, 6, 7], 3), ([6, 7, 8], 3), ([7, 8, 9], 3), ([0], 4), ([0, 1], 4), ([0, 1, 2], 4), ([1, 2, 3], 4), ([2, 3, 4], 4), ([3, 4, 5], 4), ([4, 5, 6], 4), ([5, 6, 7], 4), ([6, 7, 8], 4), ([7, 8, 9], 4), ([0], 5), ([0, 1], 5), ([0, 1, 2], 5), ([1, 2, 3], 5), ([2, 3, 4], 5), ([3, 4, 5], 5), ([4, 5, 6], 5), ([5, 6, 7], 5), ([6, 7, 8], 5), ([7, 8, 9], 5), ([0], 6), ([0, 1], 6), ([0, 1, 2], 6), ([1, 2, 3], 6), ([2, 3, 4], 6), ([3, 4, 5], 6), ([4, 5, 6], 6), ([5, 6, 7], 6), ([6, 7, 8], 6), ([7, 8, 9], 6), ([0], 7), ([0, 1], 7), ([0, 1, 2], 7), ([1, 2, 3], 7), ([2, 3, 4], 7), ([3, 4, 5], 7), ([4, 5, 6], 7), ([5, 6, 7], 7), ([6, 7, 8], 7), ([7, 8, 9], 7), ([0], 8), ([0, 1], 8), ([0, 1, 2], 8), ([1, 2, 3], 8), ([2, 3, 4], 8), ([3, 4, 5], 8), ([4, 5, 6], 8), ([5, 6, 7], 8), ([6, 7, 8], 8), ([7, 8, 9], 8), ([0], 9), ([0, 1], 9), ([0, 1, 2], 9), ([1, 2, 3], 9), ([2, 3, 4], 9), ([3, 4, 5], 9), ([4, 5, 6], 9), ([5, 6, 7], 9), ([6, 7, 8], 9), ([7, 8, 9], 9)]    

Это делается по усмотрению списка (что делает элементы цикла в списке с помощью одного кода линии). Логика этого однострочного кода следующая:

(1) для x в диапазоне (10) и для y в диапазоне (10) используются для двух независимых петель внутри списка

(2) (список, y) является общим термином цикла, поэтому он помещается перед двумя in (1)

(3) длиной списка в ( 2) не может превышать 3, а список зависит от x, поэтому

[z for z in range(x-2,x+1)] 

используется

(4), поскольку z начинается с нуля, но диапазон (x-2, x + 1) начинается с -2, чего мы не хотим, поэтому условный оператор, если z> = 0 помещается в конец списка в (2)

[z for z in range(x-2,x+1) if z >= 0] 
0
ответ дан mathguy 4 September 2018 в 10:17
поделиться

Вы также не собираетесь получать вывод, на который вы надеетесь, до тех пор, пока вы добавляете к 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)
2
ответ дан Michael 4 September 2018 в 10:17
поделиться

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

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

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

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

listoflists = []
for i in range(1, 10):
    listoflists.append((range(i), 0))
3
ответ дан Strigoides 4 September 2018 в 10:17
поделиться

Я пришел сюда, потому что я новичок в 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)]]

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

10
ответ дан user110954 4 September 2018 в 10:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: