Python 官方文档中对使用 del 语句的描述(Python 3.11.0)
文档地址:https://docs.python.org/zh-cn/3/reference/simple_stmts.html#the-del-statement
名称的删除将从局部或全局命名空间中移除该名称的绑定,具体作用域的确定是看该名称是否有在同一代码块的 global 语句中出现。如果该名称未被绑定,将会引发 NameError。
del 语句只会删除命名空间中的名称与内存地址(对应对象)的绑定,并将内存地址的引用计数减 1,但不会强制回收内存地址(对应对象)。如果不考虑 None 对象的引用计数的话,我们可以将用于名称删除的 del 语句 del a 类似地等价于 a = None。
del 语句相关命令实例如下:
import ctypes
1
demo_3 = [4, 5, 6] # 样例对象
address_3 = id(demo_3) # 样例对象的内存地址
print(“状态-1’:”, address_3, ctypes.c_size_t.from_address(address_3))
1
2
3
4
5
6
7
状态-1: 2147180403584 c_ulonglong(1)
状态-1’: 2147205328512 c_ulonglong(1)
1
2
初始化了名称 demo_1 与内存地址 2147180403584 的绑定,名称 demo_3 与内存地址 2147205328512 的绑定。
因为此时只有名称 demo_1 绑定到内存地址 2147180403584,只有名称 demo_3 绑定到内存地址 2147205328512;所以内存地址 2147180403584 和 2147205328512 的引用计数均为 1。
demo_4 = demo_3
address_4 = id(demo_4) # 样例对象的内存位置
print(“状态-2’:”, address_3, address_4,
ctypes.c_size_t.from_address(address_3), ctypes.c_size_t.from_address(address_4))
1
2
3
4
5
6
7
8
9
状态-2: 2147180403584 2147180403584 c_ulonglong(2) c_ulonglong(2)
状态-2’: 2147205328512 2147205328512 c_ulonglong(2) c_ulonglong(2)
1
2
将名称 demo_2 绑定到 demo_1 绑定的内存地址,即 2147180403584,将名称 demo_4 绑定到 demo_3 绑定的内存地址,即 2147205328512。
因为此时名称 demo_1 和名称 demo_2 均绑定到内存地址 2147180403584,名称 demo_3 和名称 demo_4 均绑定到内存地址 2147205328512;所以内存地址 2147180403584 和 2147205328512 的引用计数均为 2。
demo_3 = None
print(“状态-3’:”, address_3, address_4,
ctypes.c_size_t.from_address(address_3), ctypes.c_size_t.from_address(address_4))
1
2
3
4
5
6
7
状态-3: 2147180403584 2147180403584 c_ulonglong(1) c_ulonglong(1)
状态-3’: 2147205328512 2147205328512 c_ulonglong(1) c_ulonglong(1)
1
2
使用 del 语句移除名称 demo_1 到内存地址 2147180403584 的绑定;重新适用赋值语句,将名称 demo_3 绑定到 None 对象,从而使名称 demo_3 不再绑定到内存地址 2147205328512。
因为只有名称 demo_2 绑定到内存地址 2147180403584,只有名称 demo_4 绑定到内存地址 2147205328512;所以内存地址 2147180403584 和 2147205328512 的引用计数均为 1。
demo_4 = None
print(“状态-4’:”, address_3, address_4,
ctypes.c_size_t.from_address(address_3), ctypes.c_size_t.from_address(address_4))
1
2
3
4
5
6
7
8
状态-4: 2147180403584 2147180403584 c_ulonglong(0) c_ulonglong(0)
状态-4’: 2147205328512 2147205328512 c_ulonglong(0) c_ulonglong(0)
1
2
使用 del 语句移除名称 demo_2 到内存地址 2147180403584 的绑定;重新适用赋值语句,将名称 demo_4 绑定到 None 对象,从而使名称 demo_4 不再绑定到内存地址 2147205328512。
因为不再有名称绑定到内存地址 2147180403584 和 2147205328512;所以内存地址 2147180403584 和 2147205328512 的引用计数均为 0。