python赋值和浅拷贝_Python 直接赋值、浅拷贝和深度拷贝全解析

直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思)。

浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

下面是引用两个作者的内容 附上链接

https://www.cnblogs.com/huangbiquan/archive/2017/11/06/7795152.html

1.赋值: 只是复制了新对象的引用,不会开辟新的内存空间。

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

浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数。

如: lst = [1,2,3,[4,5]]

切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst]

工厂函数:lst1 = list(lst)

copy函数:lst1 = copy.copy(lst)

浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在lst中有一个嵌套的list[4,5],如果我们修改了它,情况就不一样了。

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

和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。

深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。

>>> import copy

>>> a = [1,2,3,4,['a','b']] #定义一个列表a

>>> b = a #赋值

>>> c = copy.copy(a) #浅拷贝

>>> d = copy.deepcopy(a) #深拷贝

>>> a.append(5)

>>> print(a)

[1, 2, 3, 4, ['a', 'b'], 5] #a添加一个元素5

>>> print(b)

[1, 2, 3, 4, ['a', 'b'], 5] #b跟着添加一个元素5

>>> print(c)

[1, 2, 3, 4, ['a', 'b']] #c保持不变

>>> print(d)

[1, 2, 3, 4, ['a', 'b']] #d保持不变

>>> a[4].append('c')

>>> print(a)

[1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])添加一个元素c

>>> print(b)

[1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟着添加一个元素c

>>> print(c)

[1, 2, 3, 4, ['a', 'b', 'c']] #c跟着添加一个元素c

>>> print(d)

[1, 2, 3, 4, ['a', 'b']] #d保持不变

#说明如下:

#1.外层添加元素时, 浅拷贝c不会随原列表a变化而变化;内层list添加元素时,浅拷贝c才会变化。

#2.无论原列表a如何变化,深拷贝d都保持不变。

#3.赋值对象随着原列表一起变化

https://www.cnblogs.com/alinh/p/6603976.html

直接赋值:其实就是对象的引用(别名)。

浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

字典浅拷贝实例

实例

1

2

3

4

5

6

7

>>>a= {1: [1,2,3]}

>>> b= a.copy()

>>> a, b

({1: [1,2,3]}, {1: [1,2,3]})

>>> a[1].append(4)

>>> a, b

({1: [1,2,3,4]}, {1: [1,2,3,4]})

深度拷贝需要引入 copy 模块:

实例

1

2

3

4

5

6

7

>>>import copy

>>> c= copy.deepcopy(a)

>>> a, c

({1: [1,2,3,4]}, {1: [1,2,3,4]})

>>> a[1].append(5)

>>> a, c

({1: [1,2,3,4,5]}, {1: [1,2,3,4]})

解析

1、b = a:赋值引用,a 和 b 都指向同一个对象。

2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

更多实例

以下实例是使用 copy 模块的 copy.copy( 浅拷贝 )和(copy.deepcopy ):

实例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#!/usr/bin/python

# -*-coding:utf-8 -*-

import copy

a= [1,2,3,4, ['a','b']]#原始对象

b= a#赋值,传对象的引用

c= copy.copy(a)#对象拷贝,浅拷贝

d= copy.deepcopy(a)#对象拷贝,深拷贝

a.append(5)#修改对象a

a[4].append('c')#修改对象a中的['a', 'b']数组对象

print('a = ', a )

print('b = ', b )

print('c = ', c )

print('d = ', d )

以上实例执行输出结果为:

1

2

3

4

('a = ', [1,2,3,4, ['a','b','c'],5])

('b = ', [1,2,3,4, ['a','b','c'],5])

('c = ', [1,2,3,4, ['a','b','c']])

('d = ', [1,2,3,4, ['a','b']])

Python 直接赋值、浅拷贝和深度拷贝区别

Python 直接赋值.浅拷贝和深度拷贝区别 转自https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-de ...

python中浅拷贝和深度拷贝的区别

在很多面试题中都会问到浅拷贝跟深度拷贝的区别,前几天一个朋友也问到了我浅拷贝跟深度拷贝到底有什么区别,这里就简单举栗子讲一下两者的区别. 浅拷贝(copy()):拷贝父对象,不会拷贝对象的内部的子对象 ...

Python 直接赋值、浅拷贝和深度拷贝解析

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 ...

图解Python的直接赋值与浅拷贝和深度拷贝三者区别

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 ...

Python直接赋值、浅拷贝和深度拷贝解析

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 ...

Perl的浅拷贝和深度拷贝

首先是深.浅拷贝的概念: 浅拷贝:shallow copy,只拷贝第一层的数据.Perl中赋值操作就是浅拷贝 深拷贝:deep copy,递归拷贝所有层次的数据,Perl中Clone模块的clone方 ...

python中赋值-浅拷贝-深拷贝之间的关系

赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...

python直接赋值,浅拷贝和深拷贝

本文参考自 定义 直接赋值:就是对象的引用(别名) 浅拷贝(copy):拷贝父对象,不拷贝对象内部的子对象 深拷贝(deepcopy):co ...

关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

当重新学习了计算机基础课程后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...

随机推荐

Activity详解一 配置、启动和关闭activity

先看效果图: Android为我们提供了四种应组件,分别为Activity.Service.Broadcast receivers和Content providers,这些组建也就是我们开发一个And ...

.NET 分页

.net分页 1.存储过程create procedure 存储过程名( @pageIndex int,                         //第几页 @pageSize int     ...

信息安全系统设计基础exp_3

详情请看搭档20135322郑伟博客,传送门如下:http://www.cnblogs.com/zhengwei0712/p/4996017.html

CXF之七 传输文件

CXF的文件传输通过MTOM实现.MTOM(SOAP Message Transmission Optimization Mechanism)SOAP消息传输优化机制,可以在SOAP消息中发送二进制数 ...

android随记

[Android]中国大部分城市地区的结构定义与按拼音排序  http://blog.csdn.net/sodino/article/details/6739522

一个ICON图标的转换程序

抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换.具体的程序就在下面,如果看的人多,过两天再把思路写一下.废话不说,见代码.                       ...

Actor-ES框架:Ray

并发 1. 并发和并行 并发:两个或多个任务在同一时间段内运行.关注点在任务分割. 并行:两个或多个任务在同一时刻同时运行.关注点在同时执行. 本文大多数情况下不会严格区分这两个概念,默认并发就是指并 ...

Codeforces 863 简要题解

文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

PHP(Dom操作)

jsDOM操作组成: ECMAscript:语法核心 BOM:浏览器对象模型 window:窗口 open close 定时器 dingsh history:历史记录 go back location ...

Saltstack 安装 命令

主机规划 10.0.0.21 master 10.0.0.22 minion 10.0.0.23 minion 基础环境 [root@10.0.0.21 ~]# cat /etc/redhat-rel ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值