Я прошел через пару глубоких погружений в список Python и то, как управляется память, это меня действительно сбило с толку!

Вот первый пример,

~$ python
>>> a = [1, 2, 3, 1, 1, 1]
>>> print(id(a))    # 49375592
>>> print(id(a[0])) # 44792032
>>> print(id(a[1])) # 44792020
>>> print(id(a[2])) # 44792008
>>> print(id(a[3])) # 44792032
>>> print(id(a[4])) # 44792032
>>> print(id(a[5])) # 44792032

В соответствии с моим пониманием переменная (a) ссылается на ячейку памяти для сохраненных элементов списка. Элемент 1 повторяется 3 раза и указывает на одну и ту же ячейку памяти, индексы 1 и 2 указывают на разные ячейки памяти, потому что это разные элементы.

  • Что, если я удалю элемент 1 из списка?
  • Будет, он удалит все вхождения из списка?
  • Будет ли list.remove (x) обрабатывать индекс также внутренне?
>>> a.remove(1) # [2, 3, 1, 1, 1]

Поскольку все элементы (1) указывают на одну и ту же ячейку памяти, но был удален первый элемент индекса, а не другие элементы. Согласно документации python, list.remove (x) удалит первый элемент, который встречается в списке. Но все же другие произошедшие элементы указывают на то же место в памяти.

Вот второй пример,

~$ python
>>> b = [[]] * 3    # [[], [], []]
>>> print(id(b))    # 49436632
>>> print(id(b[0])) # 49436712
>>> print(id(b[1])) # 49436712
>>> print(id(b[2])) # 49436712
>>> b[0].append(1)  # [[1], [1], [1]]

b - это список, который имеет три пустых списка, указывающих на одно и то же место в памяти. Здесь мы добавляем элемент 1 к первому проиндексированному списку, но он добавляет все остальные пустые списки также потому, что весь список указывает на одно и то же место в памяти. . В этом случае это не обработка на основе индекса.

  • Как Python управляет памятью с точки зрения удаления и добавления на основе приведенных примеров?

Вот третий пример,

~$ python
>>> c = [[], [], []]
>>> print(c)         # [[], [], []]
>>> print(id(c[0]))  # 49376832
>>> print(id(c[1]))  # 49376752
>>> print(id(c[2]))  # 49376112

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

Из второго примера: Действительно ли это тоже увеличивает количество памяти?

Чем это отличается от [[]] * 3 и [[], [], []]?

Спасибо за чтение ... почитайте еще один мой блог, Python - Secure Coding Guidelines.