Python中赋值,深拷贝和浅拷贝

1python变量

变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的值本身。
在这里插入图片描述

2赋值

python变量赋值实际上是对象的引用
如:

list_a = [1,2,3,"hello",["python","C++"]]
list_b = list_a

此时,list_b和list_a是一样的,他们指向同一片内存,list_b不过是list_a的别名,是引用。

我们可以使用 list_b is list_a 来判断,返回true,表明他们地址相同,内容相同。也可使用id(x) for x in list_a, list_b 来查看两个list的地址。

赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了新对象的引用。也就是说,除了list_b这个名字以外,没有其它的内存开销。修改了list_a,就影响了list_b;同理,修改了list_b就影响了list_a。

3浅拷贝

浅拷贝会创建新对象,其内容是原对象的引用。

浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数
比如对上述list_a,

切片操作:list_b = list_a[:]

列表生成式: list_b = [each for each in list_a]

copy()方法:list_b=list_a.copy()

for循环:list_b=[] for i in range(len(list_a)): list_b.append(list_a[i])

工厂函数:list_b = list(list_a)

copy函数:list_b = copy.copy(list_a)

浅拷贝产生的list_b不再是list_a了,使用is可以发现他们不是同一个对象,使用id查看,发现它们也不指向同一片内存。但是当我们使用id(x) for x in list_a 和 id(x) for x in list_b 时,可以看到二者包含的元素的地址是相同的。

在这种情况下,list_a和list_b是不同的对象,修改list_b理论上不会影响list_a。比如list_b.append([4, 5])。

但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,情况就不一样了。

list_a[4].append(“C”)。查看list_b,你将发现list_b也发生了变化。这是因为,**你修改了嵌套的list。修改外层元素,会修改它的引用,让它们指向别的位置修改嵌套列表中的元素,列表的地址并为发生变化,指向的都是同一个位置。

4深拷贝

深拷贝只有一种形式,copy模块中的deepcopy函数。

和浅拷贝对应深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。

同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。

代码举例:

import copy
a=[1,2,3,['a','b']]
b=a
c=copy.copy(a)
d=copy.deepcopy(a)
e=a.copy()
f=[]
for i in range(len(a)):f.append(a[i])
g = [each for each in a]a.append('happy')
print('a:',a,id(a))
print('b:',b,id(b))
print('c:',c,id(c))
print('d:',d,id(d))
print('e:',e,id(e))
print('f:',f,id(f))
print('g:',g,id(g))a.append('luck')
a[3].append(3)
print('-'*50)
print('a:',a,id(a))
print('b:',b,id(b))
print('c:',c,id(c))
print('d:',d,id(d))
print('e:',e,id(e))
print('f:',f,id(f))
print('g:',g,id(g))

输出结果:

a: [1, 2, 3, [‘a’, ‘b’], ‘happy’] 43169800
b: [1, 2, 3, [‘a’, ‘b’], ‘happy’] 43169800
c: [1, 2, 3, [‘a’, ‘b’]] 43171080
d: [1, 2, 3, [‘a’, ‘b’]] 43171016
e: [1, 2, 3, [‘a’, ‘b’]] 43170888
f: [1, 2, 3, [‘a’, ‘b’]] 43170824
g: [1, 2, 3, [‘a’, ‘b’]] 43170760


a: [1, 2, 3, [‘a’, ‘b’, 3], ‘happy’, ‘luck’] 43169800
b: [1, 2, 3, [‘a’, ‘b’, 3], ‘happy’, ‘luck’] 43169800
c: [1, 2, 3, [‘a’, ‘b’, 3]] 43171080
d: [1, 2, 3, [‘a’, ‘b’]] 43171016
e: [1, 2, 3, [‘a’, ‘b’, 3]] 43170888
f: [1, 2, 3, [‘a’, ‘b’, 3]] 43170824
g: [1, 2, 3, [‘a’, ‘b’, 3]] 43170760

参考自 https://www.cnblogs.com/work115/p/5619541.html
https://www.cnblogs.com/Black-rainbow/p/9577029.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel进度条与百分比不符_Excel项目管理模板V2.0

Excel表哥公众号推送的第一篇文章 如何用Excel制作一个高逼格的项目管理模板 累积获得了超多的下载量。下面是和读者朋友的一些交流互动:在使用过程中大家陆续也反馈了一些问题和建议。因此我们推出了项目管理模板V2.0 升级版!算作是给读者朋友们的一个答…

python 格式化输出%和format

1 %用法 1.1整数的输出 %o —— oct 八进制 %d —— dec 十进制 %x —— hex 十六进制 print(%o % 20) #24 print(%d % 20) #20 print(%x % 20) #141.2浮点数输出 %f ——默认保留小数点后面六位有效数字   %.3f,保留3位小数位 %e ——默认保留小数点后面六…

linux系统中安装python_2. Linux 下安装python

Linux 各个版本的系统都自带python解释器,可以在shell界面输入 python 就能进入交互界面,并显示python版本信息; 现在最流行的版本是python2.7,Centos6 默认安装2.6.6的版本,Centos7 默认安装2.7.* 的版本。 如果Cento…

零基础学习Java-素数和

在编写素数和程序中,发现了以下的问题: 在编程的过程中: 关于比较范围的不牢固各数据需要给初始化的值对于使用isPrime来辅助程序运行的遗忘 在程序运行的过程中: 除数不能为0 出现Exception in thread “main” java.lang.Ar…

访问修饰符作用范围由大到小是_9个java基础小知识

一、面向对象和面向过程的区别1. 面向过程 : 面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考虑因素时(例如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发…

System.out.println(i++); System.out.println(++i);的区别

之前一直对i和i很模糊,这次通过两个小demo来探究下。 例1: 1 public static void main(String[] args) { 2 int i2; 3 System.out.println(i); 4 System.out.println(i); 5 }run: 2 3 例2: 1 public static void…

python如何导入函数_Python导入(import)模块的方法

1、导入整个模块:模块 是扩展名为.py的文件,包含要导入到程序中的代码。import module_name 2、导入特定的函数from module_name import function_name 也可以导入多个from module_name import function_0, function_1, function_2 3、使用as 给函数指定…

白盒测试用例设计方法(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖、基本路径覆盖)

语句覆盖:每条语句至少执行一次。 判定覆盖:每个判定的所有可能结果至少出现一次。(又称“分支覆盖”) 条件覆盖:每个条件的所有可能结果至少执行一次。 判定/条件覆盖:一个判定中的每个条件的所有可能结果…

Python之列表和元组

01 序列 成员有序排列的,且可以通过下标偏移量访问到它的一个或者几个成员,这类类型统称为序列 序列数据类型包括:字符串,列表,和元组类型。 特点: 都支持下面的特性 索引与切片操作符 成员关系操作符(in , not in) 连接操作符() & 重复操作符(*) 0…

负数、取模与取余

总结: ‘%’ 在C/C,Java等语言中意为 取余 ,在python 中意为 取模 取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,异号时会有区别,所以要特别注意…

webgl编程指南源码_ThreeJS 源码剖析之 Renderer(一)

引子?最近,忽然想起曾在 WebGL 基础系列 文章中立下 flag:“后续还打算出 《ThreeJS 源码剖析》 系列”(特意翻出原话?),项目忙了一阵后,便决定开始写此系列,更新周期不固定,毕竟项目排期“天晓得”。此系…

python之集合与字典

01 一山不容二虎的集合 1.通俗来说,集合(set)是一个无序的不重复元素序列,就是一个用来存放数据的容器。 1)集合里面的元素是不可重复的: 如: s {1,2,3,4,1,2,3} print(s,type(s)) # 输出结…

求最大公约数——辗转相除法

最大公约数的基本原理: 两个数的最大公约数是指能同时整除它们的最大正整数。 设两数为a、b(a≥b)&#xff0c;求a和b最大公约数。 辗转相除法 代码如下&#xff1a; //只截取了一部分&#xff0c;完整代码可看下方 while (b<0){t a % b;a b;b t;}我们可以发现辗转相…

opencv roberts算子_边缘检测 Roberts算子

Roberts算子是一种最简单的算子&#xff0c;利用局部差分算子寻找边缘的算子。采用对角线相邻两像素之差近似梯度幅值检测边缘。。检测垂直边缘的效果比斜向边缘要好&#xff0c;定位精度高&#xff0c;对噪声比较敏感&#xff0c;无法抑制噪声的影响。Roberts边缘算子是一个2x…

Python习题week1

知识点1&#xff1a; 输入变为浮点数&#xff1a;score input("请输入成绩&#xff1a;") score float(score) 1题目&#xff1a;利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间的用B表示&#xff0c;60分以下…

参数传值swap

对于下面的代码&#xff1a; #include <stdio.h> void swap(int a,int b);int main() {int a5;int b7;swap(a,b);printf("a%d,b%d",a,b);return 0; }void swap(int a,int b) {int t a;ab;bt; }输出结果却是&#xff1a; a5,b7 Process returned 0 (0x0) ex…

python在材料方面的应用_python记录材料题带标准答案

1.Python 是如何进行内存管理的&#xff1f; 答 : 从三个方面来说 , 一对象的引用计数机制 , 二垃圾回收机制 , 三内存池机制 一、对象的引用计数机制 Python 内部使用引用计数&#xff0c; 来保持追踪内存中的对象&#xff0c; 所有对象都有引用计数。 引用计数增加的情况&…

Python习题week2

知识点总结&#xff1a; 1.去除数字前面的零 Num int(input("请输入正整数&#xff1a;")) 2. 矩阵方式输入处理 # 输入方法3 按矩阵形式输入 list_juzhen [] for i in range(3):input_str input()input_list input_str.split(" ")list_juzhen.app…

74ls90设计十进制计数器电路图_PLC控制系统的设计与调试步骤你知多少?

作为电气工程技术人员我们在平时工作中常常要对PLC控制系统进行设计与调试&#xff0c;下面给各位朋友分享一下PLC控制系统的设计与调试步骤。PLC控制系统的设计与调试过程是这样的&#xff1b;第一点需要我们深入了解被控制系统。我们在设计前应该熟悉图样资料&#xff0c;并深…

python习题week3

1、从输入的字典中获取给定key的值&#xff0c; 实现函数&#xff1a;get_key_value(source_dict, key, index0)&#xff0c;source_dict指给定的字典&#xff0c;key指需要获取的key字段&#xff0c;index指的是需要获取相同key的第几个值&#xff0c;从0开始&#xff0c;默认…