为什么Python中tuple和str的子类不支持弱引用?

2024-03-28

从版本 3.8 开始,Python 的关于弱引用的文档 https://docs.python.org/3/library/weakref.html states:

一些内置类型(例如 list 和 dict)不直接支持弱引用,但可以通过子类化来添加支持。

CPython 实现细节:其他内置类型(例如 tuple 和 int)即使在子类化时也不支持弱引用。

之前已经问过哪些类型支持弱引用 https://stackoverflow.com/questions/52011430/python-which-types-support-weak-references and 为什么内置类型不支持弱引用 https://stackoverflow.com/questions/7711246/why-weakref-doesnt-support-built-in-types-in-python/7712764,但是为什么内置类型像tuple and intCPython 不支持弱引用?


内置类型不支持弱引用(也不支持动态属性)这一事实是一个实现细节。通常,不需要弱引用(和动态属性)。不支持它们可以使内置类型的数据结构更小,并且对它们的操作更有效。由于这些类型(尤其是元组和字典)在 Python 的内部实现中使用,因此值得使用性能更高的实现。

这涵盖了内置类型,但是子类呢?

当前实现弱引用的方式是每个类定义一个固定的内存偏移量,其中每个实例存储对保存其弱引用的容器的引用。可以为有限大小的对象指定此固定偏移量,例如float因为实例的数据是固定大小的,所以弱引用指针可以放置在该数据之后的固定偏移处。可变对象,例如dict and list被分成两部分存储在内存中。第一部分包含与实例相关的不可变数据,包括指向保存可变数据的第二部分的指针(例如保存列表内容的数组)。由于实例数据的第一部分是固定大小的,因此还可以为这些可变类型指定弱引用指针的固定偏移量。问题在于str and tuple是它们都是不可变的并且大小可变。每个实例将其所有内容存储在其单个内存块中。因此,类不可能指定对所有实例都有效的弱引用指针的固定偏移量。起初我很困惑为什么int不能像这样弱引用float。然后我发现Python 中的 int 实例占用不同数量的内存,具体取决于整数的值 https://docs.python.org/3/library/stdtypes.html#int.bit_length.

可以采用不同的方式来组织数据结构,从而允许弱引用适用于内置类型或其子类,但到目前为止,这种需求还不足以产生性能影响或破坏这种基本类型。改变。

注意:这个答案基于两篇文章(here https://mail.python.org/pipermail/python-list/2005-March/346298.html and here https://mail.python.org/pipermail/python-list/2005-March/317712.html)由 Raymond Hettinger 于 2005 年 3 月 30 日向 python-list 邮件发送,主题行为“对派生自 str 的类的弱引用”)。我提供了有关日期和主题的额外详细信息,因为 python-list 邮件列表链接似乎随着时间的推移而变化,但可以通过日期和主题轻松搜索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Python中tuple和str的子类不支持弱引用? 的相关文章

  • 如何使用keras打印神经网络中预测类的名称?

    我在 keras 中使用预先训练的模型 最终将类索引预测为一些整数值 但我似乎不明白如何打印这些类的名称 我使用的模型是 ResNet 50 看一下https martin thoma com image classification ht
  • 使用sklearn宏f1-score作为tensorflow.keras中的指标

    我已经为tensorflow keras定义了自定义指标 以在每个时期之后计算宏f1分数 如下所示 from tensorflow import argmax as tf argmax from sklearn metric import
  • 无法构建具有 int 输入的 Keras 层

    我有一个复杂的 keras 模型 其中一层是自定义预训练层 需要 int32 作为输入 该模型作为继承自 Model 的类实现 其实现如下 class MyModel tf keras models Model def init self
  • 视频背景和按钮 - 移动

    我已经建立了this app http finnfrotscher pythonanywhere com on Flask 目前没有移动支持 由于视频加载时间相当长 因此我希望在手持设备上打开页面时提供相同的视频 但具有不同的分辨率 剪辑和
  • 使用 scikit-image 去模糊图像

    我正在尝试使用skimage restoration wiener http scikit image org docs dev api skimage restoration html skimage restoration wiener
  • Python——“对象布局”

    有人可以描述以下异常吗 什么是 对象布局 以及它是如何定义的 谢谢 Traceback most recent call last File test gui py line 5 in
  • Cython:如何使用 C++ 类的用户定义转换?

    赛通的文档 https cython readthedocs io en latest src userguide wrapping CPlusPlus html overloading operators似乎对如何用户定义的转换 http
  • Django 1.7 makemigrations 将表重命名为 None

    我必须将一些模型从一个应用程序移动到另一个应用程序 并且我按照此答案中的说明进行操作https stackoverflow com a 26472482 188614 https stackoverflow com a 26472482 1
  • Python:在 Plotly 中的图形上方创建注释空间

    我想在图中创建额外的注释空间 请参阅附图中的绿色区域 目前 y 轴定义了绘图的高度 我可以将绘图推到超出 y max 限制 在某个点 在图像中标记为红色 之后隐藏 y 轴吗 我尝试避免轴到达 评论部分 绿色 谢谢你 在此输入图像描述 htt
  • 如何在Python中使用x和y坐标验证ES384 JWT签名

    我有一个 JWT 如下 Authorization Bearer eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCIsImtpZCI6IjQ0ODIzZjNkLTBiMDEtNGE2Yy1hODBlLWI5ZDNlOGE
  • 可以在 __getitem__ 上使用多个参数吗?

    我正在尝试使用 getitem self x y 在我的 Matrix 类上 但在我看来它不起作用 我仍然不太了解如何使用 python 我这样称呼它 print matrix 0 0 是否有可能使用多个参数 谢谢 也许我可以只使用一个参数
  • python3导入找不到模块

    我正在尝试测试书中的一个例子 我得到了一个ImportError 该示例开始如下 from tkinter import from PP4E Gui Tools widgets import frame button entry 如果我放一
  • py2exe + sqlalchemy + sqlite 问题

    在进入全速开发模式之前 我正在尝试让一些基本的东西在 Python 中工作 具体如下 Python 2 5 4 PyQt4 4 4 3 SqlAlchemy 0 5 2 py2exe 0 6 9 setuptools 0 6c9 pysql
  • 如何在Python 2.7中访问ODB文件

    我想在 Python 中访问 ODB 文件 使用 LibreOffice Base 创建 并提取一个表以供进一步使用 ODB包含多个表 一种关系设计和多种表单 是否可以在不使用任何 SQL 的情况下实现这一目标 Edit 由于我自己解析这种
  • python lxml 我如何在项目名称中使用标签?

    我需要使用项目的特殊名称构建 xml 文件 这是我当前的代码 from lxml import etree import lxml from lxml builder import E wp E wp tmp wp title print
  • 使用日期作为窗口函数实现 RANGE

    从 SQLAlchemy 1 4 25 开始 没有内置支持 所以我尝试使用该解决方案here https stackoverflow com a 69606048 11277108 这是我的复制 from datetime import d
  • 将时间戳合并到自定义时间段中

    我对熊猫相当陌生 并且遇到了障碍 我有一个包含时间戳的数据帧 我想在我的数据框中添加一列 其中包含自定义期间名称 字符串 例如 df pd DataFrame pd date range 01 01 00 00 periods 72 fre
  • SQLAlchemy - 如何从 ResultProxy 访问列名并写入 CSV 标题

    我正在尝试使用 SQLAlchemy 建立与 PostgreSQL 数据库的连接 执行 SQL 查询并将文件的输出打印到 Linux 中的文件中 from sqlalchemy import create engine import yam
  • AttributeError:“HTTPResponse”对象没有属性“split”

    我试图从谷歌财经获取一些信息 但我收到此错误 AttributeError HTTPResponse 对象没有属性 split 这是我的Python代码 import urllib request import urllib from bs
  • 如何在 Jinja2 中包含具有相对路径的模板

    我正在尝试在模板中包含同一文件夹中的另一个模板 为此 我只是在做 import header jinja2 问题是我不断收到TemplateNotFound error 我的模板文件夹看起来像 myProject templates arb

随机推荐