• 使用del语句删除名称对引用计数的影响


    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

    1. 初始化样例对象(可变对象)
      demo_1 = [1, 2, 3] # 样例对象
      address_1 = id(demo_1) # 样例对象的内存地址
      print(“状态-1:”, address_1, ctypes.c_size_t.from_address(address_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。

    1. 添加别名绑定到样例对象
      demo_2 = demo_1
      address_2 = id(demo_2) # 样例对象的内存位置
      print(“状态-2:”, address_1, address_2,
      ctypes.c_size_t.from_address(address_1), ctypes.c_size_t.from_address(address_2))

    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。

    1. 移除名称和样例对象的绑定
      del demo_1
      print(“状态-3:”, address_1, address_2,
      ctypes.c_size_t.from_address(address_1), ctypes.c_size_t.from_address(address_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。

    1. 移除别名和样例对象的绑定
      del demo_2
      print(“状态-4:”, address_1, address_2,
      ctypes.c_size_t.from_address(address_1), ctypes.c_size_t.from_address(address_2))

    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。

  • 相关阅读:
    B094-人力资源项目-微服务授权&Oauth2
    HBuilderx快捷键
    基于Unity开发的联机解谜游戏的设计与实现
    力扣1.两数之和(JavaScript版本)
    PS/TiO2核壳复合微球/聚苯乙烯/SiO2壳核复合微球/聚苯乙烯蒙脱土二氧化硅空心微球研究
    释放创造力:生成式 AI 和 Amazon SageMaker 如何帮助企业为营销活动制作广告素材...
    一些文本在CSS上的作用
    opencv
    C++设计模式之Strategy策略模式
    Kubernetes-常用命令
  • 原文地址:https://blog.csdn.net/m0_71905144/article/details/128214173