Python 中的不可变列表

2024-01-05

我试图制作一个在整个应用程序中使用的不可变列表。我认为将这个列表包装在一个元组中可以解决问题,但似乎tuple(list)实际上并不换行,而是复制列表元素。

>>> a = [1, 2, 3, 4]
>>> b = tuple(a)
>>> b
(1, 2, 3, 4)
>>> a[0] = 2
>>> b # was hoping b[0] to be 2
(1, 2, 3, 4)

是否有一种简单的方法可以在此列表上创建不可变的列表支持的“视图”(关于此视图的操作),但反映支持列表发生的任何更改?

我意识到这个问题之前已经被问过,但是没有一个回复解决了这种视图支持列表关系(事实上,一些评论甚至表明元组按照我希望的方式工作,但上面的代码片段表明不然)。


如果您不想复制数据,并且想要传递不可更改的“列表”,一种方法是创建一个代理对象,列表的副本,这会禁用所有更改方法,并引用读取方法到原始列表 - 一些内容:

from collections import UserList

class ReadOnlyList(UserList):
    def __init__(self, original):
        self.data = original
    def insert(self, index=None, value=None):
        raise TypeError()
    __setitem__ = insert
    __delitem__ = insert
    append = insert
    extend = insert
    pop = insert
    reverse = insert
    sort = insert

通过子类化“UserList”,可以确保处理列表数据的所有代码都将通过公开公开的 Python 方法,更好的是,所有其余方法都已实现并代理到内部data属性。

下面是 2014 年的原始答案,重点关注 Python 2


    class ReadOnlyList(list):
        def __init__(self, other):
            self._list = other
        
        def __getitem__(self, index):
            return self._list[index]
        
        def __iter__(self):
            return iter(self._list)
        
        def __slice__(self, *args, **kw):
            return self._list.__slice__(*args, **kw)
        
        def __repr__(self):
            return repr(self._list)

        def __len__(self):
            return len(self._list)
        
        def NotImplemented(self, *args, **kw):
            raise ValueError("Read Only list proxy")
        
        append = pop = __setitem__ = __setslice__ = __delitem__ = NotImplemented

And, of course, implement whatever other methods you judge necessary, either raising the error (or ignoring the writting instruction) - or acessing the corresponding object in the internal list.

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

Python 中的不可变列表 的相关文章

  • Python有条件求解时滞微分方程

    我在用dde23 of pydelay包来求解延迟微分方程 我的问题 如何有条件地编写方程 例如目标方程有两个选项 when x gt 1 dx dt 0 25 x t tau 1 0 pow x t tau 10 0 0 1 x othe
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • Python Fabric - 未找到主机。请指定用于连接的(单个)主机字符串:

    如何获取 找不到主机 请指定用于连接的 单个 主机字符串 面料如何解决 def bootstrap host ec2 54 xxx xxx xxx compute 1 amazonaws com env hosts host env use
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 对数据帧的每 2 小时数据进行 Groupby

    我有一个数据框 Time T201FN1ST2010 T201FN1VT2010 1791 2017 12 26 00 00 00 854 69 0 87 1792 2017 12 26 00 20 00 855 76 0 87 1793
  • 如何在 robobrowser-python 中发出 POST 请求

    http robobrowser readthedocs org en latest api html http robobrowser readthedocs org en latest api html 我正在尝试使用 APIbrows
  • Pandas - 合并数据框以将所有值保留在左侧,如果“左侧没有键”,则从右侧“插入”值,否则“更新”左侧现有的“键”

    我有两个数据框 df1 和 df2 np random seed 0 df1 pd DataFrame key A B C D id 2 23 234 2345 2021 np random randn 4 df2 pd DataFrame
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • 在Python中用多个plot.ly图绘制图

    我在plot ly中制作了4个数字 例如 import plotly plotly as py import plotly graph objs as go trace1 go Scatter x 0 1 2 3 4 5 6 7 8 y 8
  • String.prototype.replaceAll() 不起作用[重复]

    这个问题在这里已经有答案了 我需要替换变量中的所有字符串 var a a a replace hi console log a 上面的代码仅替换第一个字符串 即hi I used replaceAll但它不起作用 Update 所有最新版本
  • iOS 的哪个图像缓存库?

    我正在构建一个相册应用程序并找到一些图像缓存库 即 JM图像缓存 https github com jakemarsh JMImageCache HJCache https github com markofjohnson HJCache
  • 单击导航栏会同时打开所有菜单

    此代码片段是我的管理员用户的导航栏 预期行为是有 3 个图标 导航菜单 用户菜单和管理按钮图标 问题是 单击任何图标时 每个图标的下拉项都会显示 预期的行为是让每个下拉菜单显示给定图标的选定信息 function NavbarAdmin c
  • 如何增加 HBase 表中的区域数量

    我在 HBase 中创建了一个表 预分割了 8 个区域 使用 HexStringSplit 作为分割算法 现在我想增加区域的数量 而不破坏现有的表及其中的数据 我创建预分割的命令是 create t1 f1 NUMREGIONS gt 15
  • 如果不设置 vm.max_map_count,ElasticSearch 5.0.0-aplha4 将无法启动

    我希望将我的 ES 版本从 2 3 更新到 5 0 0 alpha4 以便能够使用 Ingest 节点并删除 Logstash 但如果我不将 vm max map count 设置为 262144 ES 5 x 版本似乎无法启动 我不想设置
  • 尝试使视图模型项等于变量时出现空值错误

    我正在创建一个 MVC 应用程序 在其中向 JIRA 发送电子邮件 当我在视图中只有 IssueTable 的 ModelType 时 我最初让它工作 但是当我也更改它时 ModelType ViewModelClass ViewModel
  • 是否有一个示例说明如何在 Android 中使用 TouchDelegate 来增加视图点击目标的大小?

    我的理解是 当您的视图太小而无法轻松触摸时 您应该使用 TouchDelegate 来增加该视图的可点击区域 然而 在谷歌上搜索使用示例时 发现很多人都在问这个问题 但答案却很少 有谁知道为视图设置触摸委托的正确方法 例如 在每个方向上将其
  • 二维 JavaScript 数组

    简而言之 有没有办法使用与此类似的语法创建 2D javascript 数组 var newArray 0 1 2 3 4 5 6 7 8 您可以使用以下命令创建任何 n 维数组exactly您建议的格式如下例所示
  • 查找多维数组中项目的索引

    如果我有一个多维数组 Dim test As String 如何循环遍历数组以查找数组的第二维中是否包含另一个变量 显然 这是行不通的 Dim x As Integer test IndexOf otherVariable 您需要使用循环遍
  • 在 Ubuntu 上使用 Jenkins 用户从 GitHub 获取时权限被拒绝(公钥)

    这是我的设置 Jenkins 在我的 Linux 机器上以 jenkins 用户身份运行 我已经生成了一个 ssh 密钥对 如中所述Linux 设置 Git http help github com linux set up git 对于
  • rxjs 5 中的发布和多播运算符有什么区别?

    我正在阅读 rxjs 手册 我对多播和发布运算符之间的区别有点困惑 他们看起来很相似 我在阅读时也有同样的问题http reactivex io rxjs manual overview html http reactivex io rxj
  • 将 Javascript 注入 Webview - Swift

    加载一些自定义 html 后 如何将 javascript 注入到 webview IOS Swift 中 IBOutlet weak var webView UIWebView var html div div self webview
  • UIGestureRecognizer 阻止子视图处理触摸事件

    I m trying to figure out how this is done the right way I ve tried to depict the situation 我正在添加一个UITableView作为 a 的子视图UI
  • 网络检查器下资源加载之间的空白时间

    我一直在开发一个新网站并练习我的 JS jQuery AJaxy 技能 昨晚 我想看看页面渲染需要多长时间 看看是否有任何区域可以清理以提高速度 虽然页面每次加载时间约为 200 300 毫秒 但我在网络检查器下的资源加载之间看到大量空白
  • 如何在 `git merge` 之后使用 `git rebase -i` 而不会弄乱事情?

    我有以下情况 我对本地存储库进行了一些提交 然后将另一个分支 约 150 次提交 大量合并到主分支中 这里面有很多冲突 现在 我想将合并之前所做的提交移到推送之前的提交之后 通常情况下 我会使用rebase i for it 不幸的是 默认
  • 如何将代码片段嵌入到对话中?

    我不知道如何将代码片段嵌入到我的对话中 如下所示 从谷歌我找到了一些教程 例如 嵌入式代码片段简介 https github blog 2017 08 15 introducing embedded code snippets 嵌入代码片段
  • AngularJS:如何使用自定义 HTML 将 ui-grid 数据导出到 Excel?

    与此链接相关 AngularJS 如何将 ui grid 数据导出到 Excel https stackoverflow com questions 40265774 angularjs how to export ui grid data
  • 将 AngularJS 表单发送到 NodeMailer 以发送电子邮件

    我使用 AngularJS 在模态实例中构建了一个电子邮件表单 其中包含发送电子邮件 收件人电子邮件 主题和电子邮件内容的字段 该表单使用输入框和 ng models 来跟踪数据 当用户点击此表单上的发送按钮时 我想将模型收集的所有信息发送
  • Python 中的不可变列表

    我试图制作一个在整个应用程序中使用的不可变列表 我认为将这个列表包装在一个元组中可以解决问题 但似乎tuple list 实际上并不换行 而是复制列表元素 gt gt gt a 1 2 3 4 gt gt gt b tuple a gt g