Изменяемый список Python - PullRequest
       16

Изменяемый список Python

0 голосов
/ 30 октября 2018

Я пытаюсь использовать термин Python, чтобы объяснить, почему происходит следующее, может кто-нибудь объяснить, почему tmp становится [[1,2,3]], а не остается [[1,2]]?

arr = []
tmp = [1,2]
arr.append(tmp)
print arr # [[1,2]]
tmp.append(3)
print arr # [[1,2,3]]

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

arr = [] - пустой список, и когда вы добавляете tmp к нему через:

tmp = [1, 2]
arr.append(tmp)

Вы помещаете tmp в список arr, что дает вам arr = [tmp], который можно расширить до arr = [[1,2]]. Но здесь важно то, что вы поддерживаете ссылку на список [1,2] через переменную temp. Таким образом, когда вы добавляете temp, вы добавляете тот же список, что и в arr.

Для дальнейшего пояснения то, что вы добавляете tmp к arr, не означает, что результирующий список [[1,2]] будет одним непрерывным блоком в памяти. У вас будет список arr, а первый элемент arr будет указателем на список tmp.

0 голосов
/ 30 октября 2018

Это связано с тем, что tmp и arr[0] указывают на один и тот же объект. Просто проверьте это здесь, шаг за шагом:

http://www.pythontutor.com/visualize.html

Первое печатное заявление Второе заявление на печать

Вы можете проверить это вручную, используя id встроенный

>>> arr = []
>>> tmp = [1,2]
>>> arr.append(tmp)
>>> id(tmp)
4404123192
>>> id(arr[0])
4404123192
>>> assert id(tmp) == id(arr[0])
>>> tmp.append(3) # allocate more memory (if needs) and add '3' to object (list) with id 4404123192
>>> id(tmp)
4404123192
>>> id(arr[0])
4404123192
>>> print arr
[[1, 2, 3]]
0 голосов
/ 30 октября 2018

Все комментарии отличные.

arr.append(tmp)
print arr # [[1,2]]

Как видите, результат НЕ:

print arr # [1,2]

Итак, arr просто содержит ссылку на массив tmp. Если я думаю написать, вы ищете:

 arr.extend(tmp)
 print arr # [1,2]

Подробнее о разнице между append и extend методами списка в python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...