как правильно использовать b = [[1] * 3] * 3? - PullRequest
0 голосов
/ 29 марта 2011

Все,

код:

#=A===================
>>> b = [[1]*3]*3
>>> b 
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0                 
>>> b
[[0, 1, 1], [0, 1, 1], [0, 1, 1]]
>>> 
#=B===================
>>> b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0
>>> b
[[0, 1, 1], [1, 1, 1], [1, 1, 1]]
  1. Можно ли использовать формат, похожий на "b = [[1] * 3] * 3" , чтобы получить то же поведение, что и "b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] " для уменьшения типа в?

  2. as "b = [[1] * 3] * 3" может возвращать "справочный" список, это полезно для ежедневных работ? любой образец?

Спасибо! KC

Ответы [ 4 ]

1 голос
/ 29 марта 2011

Вместо этого вы можете создать свой список с пониманием списка:

b = [[1]*3 for _ in range(3)]
1 голос
/ 29 марта 2011

Ваша проблема в том, что [[1, 1, 1]] * 3 создает список из трех ссылок на один и тот же список [1, 1, 1]. Чтобы сделать то, что вы хотите, вы должны создать копии [1, 1, 1], используя list() или используя обозначение среза:

first_list = [1, 1, 1]
second_list = [first_list[:], first_list[:], first_list[:]]

или

second_list = [list(first_list), list(first_list), list(first_list)]

Чтобы сделать вышеупомянутое в одной строке, вы можете сделать это:

second_list = [[1] * 3 for i in range(3)]
1 голос
/ 29 марта 2011

Проблема с вашим кодом заключается в том, что он ссылается на тот же список, поэтому, когда вы делаете b[0][0] = 0, вы действительно обновляете значение по ссылке (на которую указывают все три массива).

Toполучить желаемые результаты, я бы сделал (используя список понимания ):

>>> b = [[1]*3 for _ in range(3)]
>>> b
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0
>>> b
[[0, 1, 1], [1, 1, 1], [1, 1, 1]]

, который фактически воссоздает список, поэтому он ссылается на другие списки, а не один и тот же в вашем ответе.

b = [[1]*3 for _ in range(3)] эквивалентно:

b = []
for _ in range(3):
  b.append([1]*3)
0 голосов
/ 29 марта 2011

В секции А: у вас есть список из 3 элементов, но все элементы указывают на один объект:

[1] * 3

как это:

a = [1,1,1]
b = [a,a,a]

Но в разделе B у вас есть список с различными предметами

...