почему getRefCount не увеличивается? - PullRequest
0 голосов
/ 10 января 2019

L инициализируется в список. Затем добавьте ссылку L1 к L. Теперь обе переменные L1 и L должны указывать на один и тот же объект. Так почему же sys.getrefcount() все еще возвращает 1?

>>> L = [1,2,3]
>>> L1 = [1,2,3]
>>> L==L1
True
>>> L is L1
False
>>> sys.getrefcount([1,2,3])
1
>>> L1 = L
>>> L1 is L
True
>>> sys.getrefcount([1,2,3])
1

1 Ответ

0 голосов
/ 10 января 2019

Вы создаете новые списки. В каждом новом списке есть только один референт, ссылка, содержащаяся в аргументе функции 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() будет их подсчитывать. Потому что пост-это заметки не единственный способ отслеживать сумки, верно?

...