首页 > 解决方案 > Python 中的 MemoryViews 和垃圾收集

问题描述

基本上:

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

arr = bytearray(somestr)

然后创建它的内存视图:

view = memoryview(arr)

我可以确定只要我在某处引用了视图对象,字节数组就会保留吗?

IE:

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

view = foo()

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

标签: pythongarbage-collectionpython-3.6memoryview

解决方案


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

通常,任何未明确描述为弱引用的内容都包含实际引用。在内存管理语言中,这是默认设置。


推荐阅读