来源

引用和值

在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用(引用是指保存的值为对象的地址),因此对于它们的使用就需要小心一些,特别是复制list和dict时。下面举个例子:

问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制

a=[1,2]
b=a

这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。
解决的方法为:

a=[1,2]
b=a[:]

这样修改a对b没有影响。修改b对a没有影响。
但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表(字典)的话,这种方法就不适用了。原因就是,像a[:]这种处理,只是将列表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。为了证明这一点,测试步骤如下:

>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]  # b的值也被修改了

可见,对a的修改影响到了b。如果解决这一问题,可以使用copy模块中的deepcopy函数。修改测试如下:
复制代码 代码如下:

>>> import copy
>>> a=[1,[2]]
>>> b=copy.deepcopy(a)
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]

有时候知道这一点是非常重要的,因为可能你的确需要一个新的列表,并且对这个新的列表进行操作,同时不想影响原来的列表。

深拷贝和浅拷贝

其实,复制列表还有以下做法,但是只有deepcopy才是全复制,其他的都是浅拷贝.

lista = [2,[4,5]]## 5种拷贝方式:
listb = lista[:]
listb = list(lista)
listb = [i for i in lista]
import copy; listb = copy.copy(lista)
import copy; listb = copy.deepcopy(lista)# 拷贝后续操作:
listb[1].append(9)
print lista, listb# 五种拷贝方式后续操作的结果(依次按顺序):
[2, [4, 5, 9]] [2, [4, 5, 9]]
[2, [4, 5, 9]] [2, [4, 5, 9]]
[2, [4, 5, 9]] [2, [4, 5, 9]]
[2, [4, 5, 9]] [2, [4, 5, 9]]
[2, [4, 5]] [2, [4, 5, 9]]  # 只有deepcopy才是深拷贝

从性能上说(利用ipython的%timeit方法),上面方法的性能是依次递减的:

In [22]: %timeit b=a[:]
10000000 loops, best of 3: 94.5 ns per loopIn [23]: %timeit b=list(a)
10000000 loops, best of 3: 153 ns per loopIn [24]: %timeit b=[i for i in a]
1000000 loops, best of 3: 238 ns per loopIn [27]: %timeit b=copy.copy(a)
The slowest run took 10.53 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 475 ns per loopIn [28]: %timeit b=copy.deepcopy(a)
The slowest run took 5.79 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.36 µs per loop

总结

浅拷贝用: listb = lista[:], 深拷贝用listb = copy.deepcopy(lista)

字典

字典自带有copy的方法,但是也是浅拷贝

dicta = {"a": 1}
dictb = dicta.copy()

参考:

  • [1]Python中使用copy模块实现列表(list)拷贝
  • [2]python的list的拷贝

转载于:https://blog.51cto.com/13103353/2107248

python拷贝list相关推荐

  1. 如何用python拷贝文件

    如何用python拷贝文件? 如何用python拷贝文件? # 1.封装数据源路径,获取文件对象,读. # 1.1 提示用户录入要备份的文件路径. srcPath = input('请录入要备份的文件 ...

  2. python拷贝文件函数_Python Set集合,函数,深入拷贝,浅入拷贝,文件处理

    1.Set基本数据类型 a.set集合,是一个无序且不重复的元素集合 classset(object):"""set() -> new empty set obje ...

  3. python拷贝是什么知识点_python闭包、深浅拷贝、垃圾回收、with语句知识点汇总...

    1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数 ...

  4. python拷贝文件到U盘

    最近在学python.刚好有个想法,不用每次都用鼠标复制黏贴就把文件拷贝到我的U盘里.如果有兴趣的还可以写个守护进程. 下面是代码 import win32file import os import ...

  5. python拷贝linux文件到windows_windows python文件拷贝到linux上执行问题

    Winform 窗体单例 有窗体Form1和窗体Form2,单击Form1上按钮,只弹出一个Form2. Form2里自定义一个方法,里面判断是否弹出Form2,没有时弹出Form2. public ...

  6. python拷贝是什么知识点_地址对象python 列表拷贝知识点 地址对象

    时间紧张,先记一笔,后续优化与完善. 我们要需拷贝一个表列的话,可以用一个特别的方法,天今给大家说下. 我先定义一个表列 a=[1,2,34] 然后我通过内置方法id()来查看对象的地址 print ...

  7. Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  8. python自动复制_Python自动复制日志,python,拷贝

    #!/usr/bin/env python import os import time import re import os from time import sleep cmd3="ad ...

  9. python 拷贝文件创建目录失败_解决python os.mkdir创建目录失败的问题

    起因 今天使用 python os.mkdir创建目录时遇到的一个小问题: feature_dir = os.path.join(os.getcwd(), 'system', 'feature') i ...

最新文章

  1. 我国近四成程序员单身 盘点各国IT从业者生存现状
  2. select下拉框兼容写法
  3. [概统]本科二年级 概率论与数理统计 第五讲 二元随机变量
  4. 5kyu Some Egyptian fractions
  5. Redux系列01:从一个简单例子了解action、store、reducer
  6. 操作RadGrid1,RadAjaxLoadingPanel1不出现
  7. 递归原来可以so easy|-连载(3)
  8. 学习笔记之数据可视化(二)—— 页面布局(下)
  9. 视觉 Transformer 综述
  10. 语义分割之Deeplabv3源码解读
  11. 下一个主要AI平台是什么?苹果说:手机
  12. ROS的学习(八)ROS的服务
  13. windows 安装python2.7
  14. 数据湖:设计更好的架构、存储、安全和数据治理
  15. 3GPP TS 24.301 Release 8 中文版
  16. 69. x 的平方根
  17. ARCore:从Android Studio开始
  18. ThinkPad SL400 使用经验小记
  19. 关于STM32PWM占空比的总结
  20. 上海一本计算机工程应用大学排名,2019上海软科世界一流学科排名计算机科学与工程专业排名密歇根州立大学排名第51-75...

热门文章

  1. 如何避免可怕的中年危机?看完这篇彻底明白了
  2. 看完豁然开朗!美团java面试难吗
  3. ts定义数组类型_TS的对象类型、数组类型、函数类型
  4. c++ 指针_C/C++学习笔记——C提高:指针强化
  5. pythonpandas重复数据统计_python – 连续的pandas数据帧之间的重复计算
  6. mysql byte函数_mysql8 参考手册-format_bytes()函数
  7. 分组聚合查询两门以上MySQL_MySQL中的分组聚合查询
  8. 如何更好地利用JavaScript数组
  9. web前端html怎么求最大值和最小值,第8篇-JavaScript专题之如何求数组的最大值和最小值...
  10. 计算机做表格软件有哪些内容,制作表格软件,详细教您excel怎么制作表格