MemoryViews и сборка мусора в Python - PullRequest
1 голос
/ 13 марта 2019

В основном:

Если я объявлю где-нибудь байт-массив:

arr = bytearray(somestr)

Затем создайте его в памяти:

view = memoryview(arr)

Могу ли я быть уверен, что до тех пор, пока у меня есть ссылка на объект вида где-нибудь, байтовый массив останется?

т.е:

def foo():
    arr = bytearray("hello world")
    return memoryview(arr)

view = foo()

Удалит ли сборщик мусора оригинальный байт-массив? Или это считается ссылкой?

1 Ответ

3 голосов
/ 13 марта 2019

Это считается ссылкой. Однако вы можете вызвать release() в представлении, чтобы удалить эту ссылку:

>>> class A(bytes):
...     def __del__(self):print('called')
... 
>>> a =A()
>>> m = memoryview(a)
>>> del a
>>> m
<memory at 0x7fddcb00a288>
>>> len(m)
0
>>> m.release()
called

Обратите внимание, что вы можете получить доступ к базовому объекту из представления, используя obj атрибут .

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

...