Python 中的内存视图和垃圾收集

MemoryViews and Garbage Collection in Python

基本上:

如果我在某处声明一个字节数组:

arr = bytearray(somestr)

然后创建它的内存视图:

view = memoryview(arr)

我能确定只要我在某处有对视图对象的引用,bytearray 就会保留吗?

即:

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

view = foo()

垃圾回收会删除原始字节数组吗?或者这算不算参考?

算作参考。 但是您可以在视图上调用 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 attribute 从视图访问基础对象。

一般而言,任何未明确描述为 weak reference 的内容都具有实际引用。在内存管理语言中,这是默认设置。