2012-06-26 3 views
3

В чем разница между этими двумя объявлениями списка списков?Python список синтаксиса списка

>>> l = [[]]*4 
>>> l 
[[], [], [], []] 
>>> l[1].append(1) 
>>> l 
[[1], [1], [1], [1]] 

>>> m = [[],[],[],[]] 
>>> m[1].append(1) 
>>> m 
[[], [1], [], []] 
+0

возможно дубликат [Python 2D список имеет странный behavor при попытке изменить одно значение] (http://stackoverflow.com/questions/2739552/python-2d-list-has-weird-behavor-when -trying-to-modify-a-single-value) – senderle

ответ

12

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

3

Возможно, это поможет сделать его более явным? Это эквивалентно первый пример:

>>> l1 = [] 
>>> l2 = [l1]*4 
>>> l2 
[[], [], [], []] 

Что вы делаете в основном там создают список с 4-х элементами, все из которых ссылаются на один и тот же список. В моем коде этот список называется l1.

Как Марк упоминается ниже в комментариях, это тоже точно так:

>>> l1 = [] 
>>> l2 = [l1, l1, l1, l1] 
>>> l2 
[[], [], [], []] 
+3

+1. Объясняя это другим, я считаю, что это помогает сделать еще один шаг дальше и объяснить, что вторая строка выше эквивалентна простому написанию 'l2 = [l1, l1, l1, l1]'. –

1

То, что помогает мне понять это явление является то, что вам нужно явно построить каждый список, который вы хотите ,

Вы можете явно построить пустой список с []. В первом примере вы сделали это один раз, поэтому у вас есть один список. Во втором вы сделали это четыре раза, поэтому есть четыре списка.

Если вы не хотите писать [] много раз вы можете сделать

[[] for _ in range(n)] 
+0

Хорошая точка. В примере OP число отдельных списков, созданных == числом '[]' 's – georg

4

это даст вам четкое представление о том, в l все объекты имеют одинаковый id() и все изменяемые поэтому редактирование любой из они будут автоматически редактировать и другие, так как все они просто ссылаются на один и тот же объект с id=18671936, а в m все имеют разные id(), поэтому все они - разные объекты.

>>> l = [[]]*4 
>>> for x in l: 
     print(id(x)) 

18671936 
18671936 
18671936 
18671936 

>>> m=[[],[],[],[]] 
>>> for x in m: 
     print(id(x)) 

10022256 
18671256 
18672496 
18631696 
Смежные вопросы