Проблема списка Python [дубликат]

10
задан Felix Kling 15 June 2011 в 10:15
поделиться

2 ответа

Это сделано специально. Когда вы используете умножение для элементов списка, вы воспроизводите ссылки.

См. раздел «Ярлыки для создания списков» в викибуке Python Programming / Lists , где подробно рассматриваются проблемы со ссылками на списки. к изменяемым объектам.

Их рекомендуемый обходной путь - понимание списка:

>>> 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]]
15
ответ дан 3 December 2019 в 17:20
поделиться

Это немного дьявольски, но вполне очевидно, когда вы понимаете, что делаете. когда вы выполняете бит [[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]]
8
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

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