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 的内容都具有实际引用。在内存管理语言中,这是默认设置。
基本上:
如果我在某处声明一个字节数组:
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 的内容都具有实际引用。在内存管理语言中,这是默认设置。