- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章深入理解python中的浅拷贝和深拷贝由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在讲什么是深浅拷贝之前,我们先来看这样一个现象:
1
2
3
4
5
|
a
=
[
'scolia'
,
123
, [], ]
b
=
a[:]
b[
2
].append(
666
)
print
a
print
b
|
为什么我只对b进行修改,却影响到了a呢?看过我在之前的文章中就说过:序列中保存的都是内存的引用.
所以,当我们通过b去修改里面的空列表的时候,其实就是修改内存中的同一个对象,所以会影响到a.
1
2
3
4
|
a
=
[
'scolia'
,
123
, [], ]
b
=
a[:]
print
id
(a),
id
(a[
0
]),
id
(a[
1
]),
id
(a[
2
])
print
id
(b),
id
(b[
0
]),
id
(b[
1
]),
id
(b[
2
])
|
代码验证无误,所以虽然a和b是两个不同的对象,但是里面的引用都是一样的。这就是所谓新的对象,旧的内容.
但是,浅拷贝还不仅如此,看下面:
1
2
3
4
5
|
a
=
[
'scolia'
,
123
, [], ]
b
=
a[:]
b[
1
]
=
666
print
a
print
b
|
这又是怎么回事呢?
看过我在python变量赋值说明的同学会知道:对于字符串、数字等不可变的数据类型,修改就相当于重新赋值。在这里就相当于刷新引用.
代码验证一下:
1
2
3
4
5
|
a
=
[
'scolia'
,
123
, [], ]
b
=
a[:]
b[
1
]
=
666
print
id
(a),
id
(a[
0
]),
id
(a[
1
]),
id
(a[
2
])
print
id
(b),
id
(b[
0
]),
id
(b[
1
]),
id
(b[
2
])
|
看来是正确的.
上面讲的这些就是浅拷贝,总结起来,浅拷贝只是拷贝了一系列引用,当我们在拷贝出来的对象对可修改的数据类型进行修改的时候,并没有改变引用,所以会影响原对象。而对不可修改的对象进行修改的是,则是新建了对象,刷新了引用,所以和原对象的引用不同,结果也就不同.
创建浅拷贝的方法:
1.切片操作 。
2.使用list()工厂函数新建对象。( b = list(a) ) 。
那么深拷贝不就是将里面引用的对象重新创建了一遍并生成了一个新的一系列引用.
基本上是这样的,但是对于字符串、数字等不可修改的对象来说,重新创建一份似乎有点浪费内存,反正你到时要修改的时候都是新建对象,刷新引用的。所以还用原来的引用也无所谓,还能达到节省内存的目的.
看下代码验证:
1
2
3
4
5
6
|
from
copy
import
deepcopy
a
=
[
'scolia'
,
123
, [], ]
b
=
deepcopy(a)
b[
1
]
=
666
print
id
(a),
id
(a[
0
]),
id
(a[
1
]),
id
(a[
2
])
print
id
(b),
id
(b[
0
]),
id
(b[
1
]),
id
(b[
2
])
|
验证正确.
深拷贝的创建:
1.正如代码示例用一样,只能通过内置的copy模块的deepcopy()方法创建.
好了,关于深浅拷贝的问题就先说到这里,有什么错误或需要补充的以后会继续.
以上这篇深入理解python中的浅拷贝和深拷贝就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
最后此篇关于深入理解python中的浅拷贝和深拷贝的文章就讲到这里了,如果你想了解更多关于深入理解python中的浅拷贝和深拷贝的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
免责声明 这篇文章是关于术语“浅拷贝”和“深拷贝”的正确用法,特别是在谈论复制一个不包含任何引用的对象时。这个问题并不意味着(也不应该)基于意见,除非真的没有关于这个话题的共识。我已将此问题标记为 C
我有这个功能 int getrelation(string name, RELATION& output){ bool found=0; int index=0;
与 why should I make a copy of a data frame in pandas 有关 我注意到在流行的backtesting图书馆, def __init__(self, d
我的问题很基础,但我想 100% 理解所有内容。 SO中的很多问题都引用了我的帖子,但我没有找到满意的答案。 我们知道java中的枚举是引用类型。让我们考虑以下片段: public static cl
请引用这个 fiddle 的问题。 http://jsfiddle.net/AQR55/ 1)为什么附加到隔离范围属性的 watch - 双向绑定(bind)到父属性,不会在更改父范围属性时触发。 在
我想使用 UP3 来完成一项非常具体的任务,我应该能够使用 API 来实现该任务。我想了解是否可以编写以下应用程序。 基于https://jawbone.com/support/articles/00
如何在辅助方法中传递上下文并提取数据? 请参阅以下代码片段: import AppContext from '../../context/AppContext' import extractDatta
我正在尝试使用 simple-git 创建浅克隆。我正在尝试创建与此命令等效的命令:git clone --depth 1 https://github.com/steveukx/git-js.git
我是一名优秀的程序员,十分优秀!