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

回到顶部(go to top)

问题描述

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

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

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

y = copy.deepcopy(x)
>>y
[1, [...]]
复制代码

 

回到顶部(go to top)

深拷贝不报错

但是我们发现深度拷贝 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 # 如果字典里已经存储了将要拷贝的对象,则直接返回
        ...    
复制代码

 

回到顶部(go to top)

==会报错

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

RecursionError: maximum recursion depth exceeded in comparison。

 

posted on   frank_cui  阅读(13)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2021-10-12 Financial - clean price 净价交易 VS dirty price 全价交易
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示