深浅拷贝

深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。

数字和字符串

对于数字字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。

  1. # 导入copy模块
  2. >>> import copy
  3. # 定义一个变量var1
  4. >>> var1 = 123
  5. # 输出var1的内存地址
  6. >>> id(var1)
  7. 1347747440
  8. >>> var2 = var1
  9. # var2的内存地址和var1相同
  10. >>> id(var2)
  11. 1347747440
  12. # 浅拷贝
  13. >>> var3 = copy.copy(var1)
  14. # var3的内存地址和var1相同
  15. >>> id(var3)
  16. 1347747440
  17. # 深拷贝
  18. >>> var4 = copy.deepcopy(var1)
  19. # var4的内存地址和var1相同
  20. >>> id(var4)
  1. 1347747440

其他数据类型

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

  • 创建一个字典var1
  1. var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}

赋值

赋值,只是创建一个变量,该变量指向原来内存地址,如:

  1. >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
  2. >>> var2 = var1
  3. >>> id(var1)
  4. 1937003361288
  5. >>> id(var2)
  6. 1937003361288

如图所示:

浅拷贝

浅拷贝,在内存中只额外创建第一层数据

  1. # 导入拷贝模块
  2. >>> import copy
  3. >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
  4. # 使用浅拷贝的方式
  5. >>> var2 = copy.copy(var1)
  6. # 两个变量的内存地址是不一样的
  7. >>> id(var1)
  8. 2084726354952
  9. >>> id(var2)
  10. 2084730248008
  11. # 但是他们的元素内存地址是一样的
  12. >>> id(var1["k1"])
  13. 2084726207464
  14. >>> id(var2["k1"])
  15. 2084726207464

如图所示:

深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

  1. # 导入拷贝模块
  2. >>> import copy
  3. >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
  4. # 使用深拷贝的方式把var1的内容拷贝给var2
  5. >>> var2 = copy.deepcopy(var1)
  6. # var1和var2的内存地址是不相同的
  7. >>> id(var1)
  8. 1706383946760
  9. >>> id(var2)
  10. 1706389852744
  11. # var1和var2的元素"k3"内存地址是不相同的
  12. >>> id(var1["k3"])
  13. 1706389853576
  14. >>> id(var2["k3"])
  15. 1706389740744
  16. # var1和var2的"k3"元素的内存地址是相同的
  17. >>> id(var1["k3"][1])
  18. 1706383265744
  19. >>> id(var2["k3"][1])
  20. 1706383265744

如图所示:

  1. import copy
  2.  
  3. # 对数字 字符串
  4. # a = 1
  5. # b = a
  6. #
  7. # print(id(a) == id(b))
  8. # b = 12
  9. # print(a, b)
  10. # print(id(a) == id(b))
  11.  
  12. # a = 'aa'
  13. # b = copy.copy(a)
  14. # print(a, b)
  15. # print(id(a) == id(b))
  16. #
  17. # b = 'bb'
  18. # print(a, b)
  19. # print(id(a) == id(b))
  20.  
  21. # c = copy.deepcopy(a)
  22. # print(a, c)
  23. # print(id(a) == id(c))
  24. #
  25. # c = 'cc'
  26. # print(a, c)
  27. # print(id(a) == id(c))\
  28.  
  29. # a = [1, 2, 3, 4, 5]
  30. #
  31. # b = a
  32. #
  33. # b[1] = 5
  34. # print(a, b)
  35. # print(id(a) == id(b))
  36.  
  37. #
  38. # a = [1, 2, 3, 4, 5, [1, 2]]
  39. # b = copy.copy(a)
  40. # print(a, b)
  41. # print(id(a) == id(b))
  42. # print(id(a[1]) == id(b[1]))
  43. # print(id(a[5]) == id(b[5]))
  44. # b[1] = 10
  45. # print(a[1])
  46. # print(id(a[1]) == id(b[1]) )
  47. #
  48. # print('----------')
  49. # print(id(a[5][0]) == id(b[5][0]))
  50. # b[5][0] = 50
  51. # print(a[5][0])
  52. # print(id(a[5][0]) == id(b[5][0]))
  53.  
  54. a = [1, 2, 3, 4, 5, [5, [[1,2],8]], {'a': 'aa'}]
  55. b = copy.deepcopy(a)
  56. print(id(a) == id(b))
  57. print(id(a[3]) == id(b[3]))
  58. print(id(a[5]) == id(b[5]))
  59. # b[3] = 20
  60. # print(a, b )
  61. print(id(a[5][1][0][1]) == id(b[5][1][0][1]))
  62. b[5][1][0] = 20
  63. print(a[5][1][0])

优秀的深浅拷贝博客https://www.cnblogs.com/fandx/p/10462913.html?tdsourcetag=s_pctim_aiomsg

python之拷贝(深浅)的更多相关文章

  1. 第五篇python进阶之深浅拷贝

    目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...

  2. 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝

    Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...

  3. Python 中的深浅拷贝

    Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...

  4. 【Python】Python中的深浅拷贝

    [转]python 复制(拷贝)对象 -- ::| 分类: Python |举报|字号 订阅 下载LOFTER我的照片书 | 需求: 你想复制一个对象.因为在Python中,无论你把对象做为参数传递, ...

  5. python的拷贝方式以及深拷贝,浅拷贝详解

    python的拷贝方法有:切片方法, 工厂方法, 深拷贝方法, 浅拷贝方法等. 几种方法都可以实现拷贝操作, 具体区别在于两点:1.代码写法不同. 2.内存地址引用不同 代码演示: import co ...

  6. python——赋值与深浅拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  7. Python中的深浅拷贝

    1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...

  8. python基础(6)-深浅拷贝

    赋值 字符串和数字 # id()函数可以获取变量在内存中的地址标识 num1 = 2; num2 = 2; print(id(num1)) # result:8791124202560 print(i ...

  9. Python学习(006)-深浅拷贝及集合

     深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...

随机推荐

  1. vue.js的一些模板指令简述

    1.模板指令都是写在<template></template>html里面   v-text : value是什么就显示什么,如果value里面有html的标签,也会直接显示出 ...

  2. Django框架 之 modelform组件

    Django框架 之 modelform组件 浏览目录 创建mldelform 添加记录 编辑记录 Django框架中的modelform组件 通过名字我们可以看出来,这个组件的功能就是把model和 ...

  3. mysql_5.6内存过高问题解决

    MySQL 5.6安装完之后,每过一段时间就会莫名其妙挂掉.而且还很难启动.非要重启服务器,才能拉起mysql. 后来分析是由于mysql启动后内存过高,跑一段时间就会由于内存不足而被杀死. 今天分析 ...

  4. [转]TimeQuest之delay_fall clock_fall傻傻分不清楚

    这篇我想分享一个之前在用TimeQuest约束双边沿模块的input delay时犯得一个错误,有人看了可能会觉得傻傻的,什么眼神,falling delay和 falling clk怎么会分不清呢, ...

  5. Java String 常用类的使用方法

    public static void main(String[] args) { // TODO Auto-generated method stub /* * 使用for循环遍历数组 * int a ...

  6. cad转shapefile文件

    private ESRI.ArcGIS.Controls.AxTOCControl axTOCControl1; private ESRI.ArcGIS.Controls.AxLicenseContr ...

  7. 如何快速搭建基于python+appium的自动化测试环境

    首先申明本文是基本于Python与Android来快速搭建Appium自动化测试环境: 主要分为以下几个步骤: 前提条件: 1)安装与配置python环境,打开 Python官网,找到“Downloa ...

  8. jquery中attr和prop的区别(转)

    在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...

  9. Windows 下 MongoDb 简单配置

    以管理员的启动cmd        进入安装目录下                      输入:  mongod  --auth --port 3406  --dbpath=库地址  --logp ...

  10. Atcoder Grand Contest 032C(欧拉回路,DFS判环)

    #include<bits/stdc++.h>using namespace std;int vis[100007];vector<int>v[100007];vector&l ...