Проблема со списком Python
Питон:
m=[[0]*3]*2
for i in range(3):
m[0][i]=1
print m
Я ожидаю, что этот код должен напечатать
[[1, 1, 1], [0, 0, 0]]
но это печатает
[[1, 1, 1], [1, 1, 1]]
2 ответа
Это по замыслу. Когда вы используете умножение на элементы списка, вы воспроизводите ссылки.
См. Раздел "Ярлыки создания списков" в викибуке "Программирование / списки Python", в котором подробно рассматриваются проблемы со ссылками на списки изменяемых объектов.
Их рекомендуемый обходной путь - понимание списка:
>>> s = [[0]*3 for i in range(2)]
>>> s
[[0, 0, 0], [0, 0, 0]]
>>> s[0][1] = 1
>>> s
[[0, 1, 0], [0, 0, 0]]
Это немного дьявольски, но совершенно очевидно, когда вы понимаете, что делаете. когда вы делаете [[0]*3]*2
немного, вы сначала создаете список с 3 нулями, а затем копируете его, чтобы сделать два элемента. Но когда вы делаете эту копию, вы не создаете новые списки с одинаковым содержимым, а скорее ссылаетесь на один и тот же список несколько раз. Поэтому, когда вы меняете один, они все меняются.
Пример, чтобы выделить это:
In [49]: s = [[]]*2 # Create two empty lists
In [50]: s # See:
Out[50]: [[], []]
In [51]: s[0].append(2) # Alter the first element (or so we think)
In [52]: s # OH MY, they both changed! (because they're the same list!)
Out[52]: [[2], [2]]