python之拷贝(深浅)
深浅拷贝
深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。
数字和字符串
对于数字
和字符串
而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。

- # 导入copy模块
- >>> import copy
- # 定义一个变量var1
- >>> var1 = 123
- # 输出var1的内存地址
- >>> id(var1)
- 1347747440
- >>> var2 = var1
- # var2的内存地址和var1相同
- >>> id(var2)
- 1347747440
- # 浅拷贝
- >>> var3 = copy.copy(var1)
- # var3的内存地址和var1相同
- >>> id(var3)
- 1347747440
- # 深拷贝
- >>> var4 = copy.deepcopy(var1)
- # var4的内存地址和var1相同
- >>> id(var4)
1347747440

其他数据类型
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
- 创建一个字典
var1
- var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:

- >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
- >>> var2 = var1
- >>> id(var1)
- 1937003361288
- >>> id(var2)
- 1937003361288

如图所示:
浅拷贝
浅拷贝,在内存中只额外创建第一层数据

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

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

- # 导入拷贝模块
- >>> import copy
- >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
- # 使用深拷贝的方式把var1的内容拷贝给var2
- >>> var2 = copy.deepcopy(var1)
- # var1和var2的内存地址是不相同的
- >>> id(var1)
- 1706383946760
- >>> id(var2)
- 1706389852744
- # var1和var2的元素"k3"内存地址是不相同的
- >>> id(var1["k3"])
- 1706389853576
- >>> id(var2["k3"])
- 1706389740744
- # var1和var2的"k3"元素的内存地址是相同的
- >>> id(var1["k3"][1])
- 1706383265744
- >>> id(var2["k3"][1])
- 1706383265744

如图所示:

- import copy
- # 对数字 字符串
- # a = 1
- # b = a
- #
- # print(id(a) == id(b))
- # b = 12
- # print(a, b)
- # print(id(a) == id(b))
- # a = 'aa'
- # b = copy.copy(a)
- # print(a, b)
- # print(id(a) == id(b))
- #
- # b = 'bb'
- # print(a, b)
- # print(id(a) == id(b))
- # c = copy.deepcopy(a)
- # print(a, c)
- # print(id(a) == id(c))
- #
- # c = 'cc'
- # print(a, c)
- # print(id(a) == id(c))\
- # a = [1, 2, 3, 4, 5]
- #
- # b = a
- #
- # b[1] = 5
- # print(a, b)
- # print(id(a) == id(b))
- #
- # a = [1, 2, 3, 4, 5, [1, 2]]
- # b = copy.copy(a)
- # print(a, b)
- # print(id(a) == id(b))
- # print(id(a[1]) == id(b[1]))
- # print(id(a[5]) == id(b[5]))
- # b[1] = 10
- # print(a[1])
- # print(id(a[1]) == id(b[1]) )
- #
- # print('----------')
- # print(id(a[5][0]) == id(b[5][0]))
- # b[5][0] = 50
- # print(a[5][0])
- # print(id(a[5][0]) == id(b[5][0]))
- a = [1, 2, 3, 4, 5, [5, [[1,2],8]], {'a': 'aa'}]
- b = copy.deepcopy(a)
- print(id(a) == id(b))
- print(id(a[3]) == id(b[3]))
- print(id(a[5]) == id(b[5]))
- # b[3] = 20
- # print(a, b )
- print(id(a[5][1][0][1]) == id(b[5][1][0][1]))
- b[5][1][0] = 20
- print(a[5][1][0])
优秀的深浅拷贝博客https://www.cnblogs.com/fandx/p/10462913.html?tdsourcetag=s_pctim_aiomsg
python之拷贝(深浅)的更多相关文章
- 第五篇python进阶之深浅拷贝
目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...
- 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...
- Python 中的深浅拷贝
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
- 【Python】Python中的深浅拷贝
[转]python 复制(拷贝)对象 -- ::| 分类: Python |举报|字号 订阅 下载LOFTER我的照片书 | 需求: 你想复制一个对象.因为在Python中,无论你把对象做为参数传递, ...
- python的拷贝方式以及深拷贝,浅拷贝详解
python的拷贝方法有:切片方法, 工厂方法, 深拷贝方法, 浅拷贝方法等. 几种方法都可以实现拷贝操作, 具体区别在于两点:1.代码写法不同. 2.内存地址引用不同 代码演示: import co ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
- python基础(6)-深浅拷贝
赋值 字符串和数字 # id()函数可以获取变量在内存中的地址标识 num1 = 2; num2 = 2; print(id(num1)) # result:8791124202560 print(i ...
- Python学习(006)-深浅拷贝及集合
深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...
随机推荐
- vue.js的一些模板指令简述
1.模板指令都是写在<template></template>html里面 v-text : value是什么就显示什么,如果value里面有html的标签,也会直接显示出 ...
- Django框架 之 modelform组件
Django框架 之 modelform组件 浏览目录 创建mldelform 添加记录 编辑记录 Django框架中的modelform组件 通过名字我们可以看出来,这个组件的功能就是把model和 ...
- mysql_5.6内存过高问题解决
MySQL 5.6安装完之后,每过一段时间就会莫名其妙挂掉.而且还很难启动.非要重启服务器,才能拉起mysql. 后来分析是由于mysql启动后内存过高,跑一段时间就会由于内存不足而被杀死. 今天分析 ...
- [转]TimeQuest之delay_fall clock_fall傻傻分不清楚
这篇我想分享一个之前在用TimeQuest约束双边沿模块的input delay时犯得一个错误,有人看了可能会觉得傻傻的,什么眼神,falling delay和 falling clk怎么会分不清呢, ...
- Java String 常用类的使用方法
public static void main(String[] args) { // TODO Auto-generated method stub /* * 使用for循环遍历数组 * int a ...
- cad转shapefile文件
private ESRI.ArcGIS.Controls.AxTOCControl axTOCControl1; private ESRI.ArcGIS.Controls.AxLicenseContr ...
- 如何快速搭建基于python+appium的自动化测试环境
首先申明本文是基本于Python与Android来快速搭建Appium自动化测试环境: 主要分为以下几个步骤: 前提条件: 1)安装与配置python环境,打开 Python官网,找到“Downloa ...
- jquery中attr和prop的区别(转)
在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...
- Windows 下 MongoDb 简单配置
以管理员的启动cmd 进入安装目录下 输入: mongod --auth --port 3406 --dbpath=库地址 --logp ...
- Atcoder Grand Contest 032C(欧拉回路,DFS判环)
#include<bits/stdc++.h>using namespace std;int vis[100007];vector<int>v[100007];vector&l ...