Python 对于赋值语句,浅拷贝与深拷贝的理解
时间:2019-10-23
本文章向大家介绍Python 对于赋值语句,浅拷贝与深拷贝的理解,主要包括Python 对于赋值语句,浅拷贝与深拷贝的理解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
不同于C语言的变量与内存绑定的形式,python采用的引用机制,即变量指向内存地址。
首先提一下C语言中变量与内存的关系:变量与内存绑定。
当变量的值被改变时,实质上是该变量对应的内存中的数据发生了改变,而变量与内存间的绑定关系仍没变。即不管如何改变变量a的值,执行id(a)永远是相同的。
python中变量与内存的关系:变量指向内存。
当变量的值被改变时,原本的内存会被该变量舍弃,该变量会指向新的内存地址。(可变对象与不可变对象有不同的表现形式)
一、赋值语句:
import copy a = [9999999,'str',{1,2,3},[1,2],{'apple':10,'orange':5}] print('赋值语句'.center(50,'*')) b = a print('地址容器:',bool(id(a)==id(b))) print('不可变对象:',bool(id(a[0])==id(b[0]))) print('不可变对象:',bool(id(a[1])==id(b[1]))) print('可变对象:',bool(id(a[2])==id(b[2]))) print('可变对象:',bool(id(a[3])==id(b[3]))) print('可变对象:',bool(id(a[4])==id(b[4])))
输出如下:
***********************赋值语句***********************
地址容器: True
不可变对象: True
不可变对象: True
可变对象: True
可变对象: True
可变对象: True
二、浅拷贝
import copy a = [9999999,'str',{1,2,3},[1,2],{'apple':10,'orange':5}] print('浅复制'.center(50,'*')) c = copy.copy(a) print('地址容器:',bool(id(a)==id(c))) #列表与字典并不是直接存放数据,而是存放着数据的地址,进而通过地址找到数据。将存放各数据内存地址的称为地址容器(我自己取的) print('不可变对象:',bool(id(a[0])==id(c[0]))) print('不可变对象:',bool(id(a[1])==id(c[1]))) print('可变对象:',bool(id(a[2])==id(c[2]))) print('可变对象:',bool(id(a[3])==id(c[3]))) print('可变对象:',bool(id(a[4])==id(c[4])))
输出如下:
***********************浅复制************************
地址容器: False
不可变对象: True
不可变对象: True
可变对象: True
可变对象: True
可变对象: True
三、深拷贝
import copy a = [9999999,'str',{1,2,3},[1,2],{'apple':10,'orange':5}] print('深复制'.center(50,'*')) d = copy.deepcopy(a) print('地址容器:',bool(id(a)==id(d))) print('不可变对象:',bool(id(a[0])==id(d[0]))) print('不可变对象:',bool(id(a[1])==id(d[1]))) print('可变对象:',bool(id(a[2])==id(d[2]))) print('可变对象:',bool(id(a[3])==id(d[3]))) print('可变对象:',bool(id(a[4])==id(d[4])))
输出如下:
***********************深复制************************
地址容器: False
不可变对象: True
不可变对象: True
可变对象: False
可变对象: False
可变对象: False
四、分析
原本变量a的指向:
赋值语句:共享容器与数据。
在列表a中修改可变对象,b种对应的也会发生改变。
浅拷贝:容器不同,但共享数据。
在列表a中修改可变对象,b中对应的也会发生改变。
深拷贝:容器不同,共享不可变对象,不共享可变对象。
在列表a中修改可变对象,b中数据不会发生改变。
原文地址:https://www.cnblogs.com/huiyaoo/p/11727242.html
- ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[上篇]
- 被遗忘的软件产品形态
- 区块链是什么,一文给您讲清楚
- ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[下篇]
- 2017科技颠覆生活哪家强?
- 柯洁宣布复出,再次迎战AI!但对手不再是阿尔法狗……
- 【Scikit-Learn 中文文档】协方差估计 / 经验协方差 / 收敛协方差 / 稀疏逆协方差 / Robust 协方差估计 - 无监督学习 - 用户指南 | ApacheCN
- 先搞懂这八大基础概念,再谈机器学习入门!
- 人工智能化的传感器技术
- 带有CSS3的动画3D条形图
- 有故事的微信小游戏“跳一跳”
- 机器学习敲门砖:任何人都能看懂的TensorFlow介绍
- 跟小编来体验一下微信小程序
- DeepVO:基于深度循环卷积神经网络的端到端视觉里程计
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法