zoukankan      html  css  js  c++  java
  • python list的深浅copy

     
    结论:
    ①浅拷贝是根据list中的第一层元素所在内存地址copy的,如果源第一层list中的内存地址变了,那么目的list仍然不变;如果list里面的list元素内存地址变了,那么目的list从源list来copy一份,只因为其所在的list的元素内存地址没有变化,顾copy一份;
    ②深拷贝是无论源list做何种操作,目的list均与源list均与修改前保持一致。
     
    1.浅copy:指的是复制list中的第一层元素所在的内存地址,如果源列表改变,那么目的列表也不会改变;如果列表套列表,那么修改源列表中的子列表时,对应的目的列表也会改变,示例如下:
    • 单一list
    >>> a = [1,2,3,4,5]
    >>> b = a.copy() #复制一份,其实是复制内存地址
    >>> b
    [1, 2, 3, 4, 5]
    >>> a[2] = 10 #第3个元素从新赋值
    >>>a
    >>>a = [1,2,10,4,5] #生成新的列表,列表的内存地址不变,但是里面的内存地址变了
    >>> b
    [1, 2, 3, 4, 5] #还是整个列表的内存地址,里面元素还保留原始的内存地址
    •  list套list
    >>> a.insert(2,[1,2,3]) #插入一个列表
    >>> a
    [1, 2, [1, 2, 3], 10, 4, 5]
    >>> b = a.copy() #浅拷贝一份内存地址
    >>> b
    [1, 2, [1, 2, 3], 10, 4, 5]
    >>> a[2][2] = 20 #替换内部小列表中的某一个元素,但是该小列表对应的内存地址不变
    >>> b
    [1, 2, [1, 2, 20], 10, 4, 5] #b中也会改变
     
    2.深拷贝 :指的是完全复制源列表,无论深copy后源列表做任何操作,都不会改变目的列表的元素
    深copy需要用到copy模块,方法是b = copy.deepcopy(a)
    • 单一list(跟浅copy效果一致)
    >>> import copy #引入第三方模块copy
    >>> a = [1,2,3,3,4,5]
    >>> b = copy.deepcopy(a) #调用深拷贝的方法
    >>> b
    [1, 2, 3, 3, 4, 5]
    >>> a[2] = 10 #更改源列表的元素值
    >>> a
    [1, 2, 10, 3, 4, 5]
    >>> b #但是是深拷贝,该列表没有变化
    [1, 2, 3, 3, 4, 5]
    • list 套list
    上个例子还看不出来深拷贝的用处,下面来插入一个list再看
    >>> import copy
    >>> a = [1,2,3,3,4,5]
    >>> b = copy.deepcopy(a)
    >>> b
    [1, 2, 3, 3, 4, 5]
    >>> a.insert(1,[555,444])
    >>> a
    [1, [555, 444], 2, 10, 3, 4, 5]
    >>> b
    [1, 2, 3, 3, 4, 5]
  • 相关阅读:
    Js默认参数(多参数情况)
    用clipboard.js实现纯JS复制文本到剪切板
    C# 获取当前方法的名称空间、类名和方法名称
    C# 爬虫 Jumony-html解析
    C# 爬虫 正则、NSoup、HtmlAgilityPack、Jumony四种方式抓取小说
    C# Split 字符文本中的字符太多
    jQuery的ajax跨域 Jsonp原理
    C# 未能加载文件或程序集“xxx”或它的某一个依赖项。参数错误。(异常来自 HRESULT:0x80070057 (E_INVALIDARG))
    美化博客园 添加网易云音乐及生成文章目录
    SQLAlchemy详细教程
  • 原文地址:https://www.cnblogs.com/ddpeng/p/9501961.html
Copyright © 2011-2022 走看看