首页 > 编程语言 >Python - 深拷贝一个带有指向自身引用的列表,会报错么?紧接着用==比较,会报错么?

Python - 深拷贝一个带有指向自身引用的列表,会报错么?紧接着用==比较,会报错么?

时间:2023-10-12 17:00:41浏览次数:38  
标签:... Python memo 列表 报错 拷贝 字典

问题描述

深拷贝一个带有指向自身引用的列表:

  • 列表 x 中有指向自身的引用,因此 x 是一个无限嵌套的列表。
import copy
x = [1]
x.append(x)

>>x
[1, [...]]

y = copy.deepcopy(x)
>>y
[1, [...]]

 

深拷贝不报错

但是我们发现深度拷贝 x 到 y 后,程序并没有出现 stack overflow 的现象

其实,这是因为深度拷贝函数 deepcopy 中会维护一个字典,记录已经拷贝的对象与其 ID。拷贝过程中,如果字典里已经存储了将要拷贝的对象,则会从字典直接返回,我们来看相对应的源码就能明白:

def deepcopy(x, memo=None, _nil=[]):
    """Deep copy operation on arbitrary Python objects.
      
  See the module's __doc__ string for more info.
  """
  
    if memo is None:
        memo = {}
    d = id(x) # 查询被拷贝对象x的id
  y = memo.get(d, _nil) # 查询字典里是否已经存储了该对象
  if y is not _nil:
      return y # 如果字典里已经存储了将要拷贝的对象,则直接返回
        ...    

 

==会报错

'=='操作符则会递归地遍历对象的所有值,并逐一比较。而x是一个无限嵌套的列表,递归会无休无止下去,到达限定的层数,就会报错:

RecursionError: maximum recursion depth exceeded in comparison。

 

标签:...,Python,memo,列表,报错,拷贝,字典
From: https://www.cnblogs.com/frankcui/p/17759911.html

相关文章

  • 动物识别系统python+Django网页界面+TensorFlow算法模型+数据集训练
    一、简介动物识别系统。基于Python+TensorFlow+Django网页框架+ResNet50算法模型实现实现步骤如下:收集多种动物的图片数据集,并整理归类然后使用TensorFlow搭建ResNet50算法模型网络对数据集进行多次迭代训练最后得到一个精度较高的H5模型文件基于训练好的模型,使用Django开......
  • 获取打印机时候报错 RPC 服务不可用
    检查以下几个服务状态是否正常PrintSpoolerRemoteProcedureCall(RPC)RemoteProcedureCall(RPC)LocatorDCOMServerProcessLauncher......
  • pgsql sql语句参数量太多报错
    批量入库pgsql的时候,发现pgsql一次只能传3万多参数,要么改数据库链接url的参数要么分批次的批量插入。 分批次批量插入: 1intlimit;//要切割成多少份2intMAX_NUMBER;//每份最多多少条数据34List<List<Integer>>splitList=Stream.iterate(0,n->n+1).......
  • Python 列表详解:从基础到进阶
    Python是一种广泛使用的高级编程语言,它的设计强调代码的可读性和简洁的语法。Python支持多种编程范式,包括过程、面向对象和函数式编程。在Python中,列表是一种非常重要的数据类型,它可以包含各种类型的元素,如数字、字符串和其他列表。本文将详细介绍Python列表的基础和进阶用法。【基......
  • python beautifulsoup
    beautifulsoup1.安装pipinstallbeautifulsoup4如果这个安装不了,就手动下载安装:下载地址:https://www.crummy.com/software/BeautifulSoup/bs4/download/4.5/解压后执行pythonsetup.pyinstall拷贝python安装目录下的C:\ProgramFiles\python\Tools\scripts\2to3.py文......
  • python_批量处理excel文件
    情况pipinstallopenpyxlpipinstallxlrd数据Excel文件的格式为xls和xlsx,pandas读取excel文件需要安装依赖库xlrd和openpyxl。!注意:当xlrd>=2.0时,只支持xls格式,不再支持xlsx。数据代码importpandasaspdimportosimportjsonif__name__=="__main__":e......
  • 使用python来对字符编码序列进行互转
    排查字符集问题时,有的时候发生乱码不知道如何生成的字符,此时就需要通过字节序列来判断该字符是什么。已知utf8字节序列时,转换为unicode或者gb18030字节序列:>>>a=b'\xef\xbc\xa1'#此时a是一个bytes对象>>>b=a.decode("utf8")#此时b是一个str对象,内部是unicode的编码字......
  • 【Python&语义分割】Segment Anything(SAM)模型全局语义分割代码+掩膜保存(二)
    ​ 我上篇博文分享了SegmentAnything(SAM)模型的基本操作,这篇给大家分享下官方的整张图片的语义分割代码(全局),同时我还修改了一部分支持掩膜和叠加影像的保存。1SegmentAnything介绍1.1概况        MetaAI公司的SegmentAnything模型是一项革命性的技术,该模型能......
  • vue3.2+ts报错:找不到模块“./App.vue”或其相应的类型声明。
    解决方法:在项目根目录创建env.d.ts 文件(如果已有,则在文件中追加)加入下面内容:declaremodule'*.vue'{ importtype{DefineComponent}from'vue'; constvueComponent:DefineComponent<{},{},any>; exportdefaultvueComponent;} 报错原因:未定义.vue文件......
  • 报错解决:java.security.InvalidKeyException: Illegal key size(微信支付v3遇到的问
    前言在使用微信支付v3生成jar包后本地测试没有问题在开发小程序支付功能的时候:本地开发好好的,放在linux服务器上运行时碰到报错原因是因为微信支付256位秘钥加密解密策略 可能会导致某些jdk的版本加密解密出现问题解决首先观察你这个目录下的文件根据文件内容做判断看下......