Вы создаете новые списки. В каждом новом списке есть только один референт, ссылка, содержащаяся в аргументе функции sys.getrefcount()
.
Если вы хотите увидеть счетчик ссылок для объектов списка, на которые ссылаются имена L
и L1
, вам придется передать эти имена в функцию sys.getrefcount()
:
>>> import sys
>>> L = [1,2,3]
>>> sys.getrefcount(L)
2
>>> L1 = L
>>> L1 is L
True
>>> sys.getrefcount(L)
3
>>> sys.getrefcount(L1)
3
L
начинается с 2 ссылок: самого имени L
и аргумента sys.getrefcount()
. Когда вы затем назначаете объект L1
, теперь есть еще одна ссылка на него.
Не запутайтесь между синтаксисом, который создает список значение , и тем, что хранится в памяти. Если вы представляете себе две идентичные сумки для покупок, и вы идете в магазин и кладете пакет с печеньем в одну сумку, а другой пакет с печеньем того же типа в другую сумку, эти две сумки являются то же самое? Они выглядят одинаковыми, вы могли бы съесть эти печенья, и они бы попробовали того же самого, но они по-прежнему две отдельные сумки с печеньем в них . Если кто-то украл одну из этих сумок, у вас осталась бы другая сумка, чтобы съесть оставшуюся часть печенья.
Запись [1, 2, 3]
на Python указывает Python создать новую сумку для покупок (список) и положить несколько файлов cookie (целые числа). Эта новая сумка выглядит так же, как и другие сумки (списки), поэтому они имеют то же значение (==
возвращает True
), но они не являются одной сумкой (is
не возврат True
).
Теперь положите на эти сумки пост-заметки с названиями сумок. Напишите L
на одной заметке, наклейте на одну сумку. Напишите L1
на другой записке, наклейте ее на другую сумку. Их значения все те же, но когда вы спрашиваете Python, если L
и L1
- это одна и та же сумка, то вы знаете, что это не так, заметки после размещения прикрепляются к двум разным сумкам. Но что, если вы должны были переместить эту записку L
после того, как она была прикреплена, и переместить ее в другую сумку, к которой прикреплена L1
? Теперь у вас есть две заметки на одной сумке, поэтому L is L1
теперь верно.
sys.getrefcount()
говорит вам, сколько пост-заметок там прилипло к сумкам. Но вы должны рассказать об этом после заметок, а не о новых сумках.
И, наконец, вы можете поместить эти пакеты в другие пакеты или положить пакеты в выдвижные ящики в системе хранения (или dict
объектов), и getrefcount()
будет их подсчитывать. Потому что пост-это заметки не единственный способ отслеживать сумки, верно?