吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1159|回复: 11
收起左侧

[已解决] python入门copy疑惑求解

[复制链接]
sundiom 发表于 2021-7-29 19:53
本帖最后由 sundiom 于 2021-7-31 22:02 编辑

学习基础《Python编程快速上手-让繁琐工作自动化》先上示例代码
[Python] 纯文本查看 复制代码
import copy
origin = [1, 2, [3, 4]]
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)


1问 运行a = origin是不是代表着origin被分成了实体和影子,实体变化会影响着影子,影子变化会影响着实体。这两个是完全一样的存在。
2问 cop1 = origin.copy()是不是和cop1 = copy.copy(origin)运行结果完全一样的呢(代码运行没有区别那种)

如果运行origin[2][0] = 'Hey!'
cop1也会随之改变
3问 为啥运行origin[1] = 'S'的时候 cop1没有产生变化呢,是浅复制理解错了?如果浅复制没有理解错的话,是不是代表着origin里面包含着2部分,一部分是【1,2和列表里列表】,另一部分是【列表里列表】,浅复制copy只是复制了【1,2】并没有影响【列表里的列表】

书中有这么一句话:
如果要复制的列表中包含了列表,那就使用 copy.deepcopy()函数来代替。deepcopy()函数将同时复制它们内部的列表。

我理解的就行copy()只负责复制第一层。deepcopy()复制所有层次的复制,是我们正常理解那种,完全复制。对么?
求解惑,感谢。



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

从零学习的歪经小 发表于 2021-7-29 21:29
卧槽,我学小半年,这模块咋没见过。。
skyward 发表于 2021-7-29 21:34
anandyuan 发表于 2021-7-29 22:29
对,浅copy:复制父对象,子对象仍然使用引用的方式。深copy:复制了对象和对象的所有子对象。
 楼主| sundiom 发表于 2021-7-29 23:03
anandyuan 发表于 2021-7-29 22:29
对,浅copy:复制父对象,子对象仍然使用引用的方式。深copy:复制了对象和对象的所有子对象。

感谢解惑,最后问下(新变量) cop1 = origin.copy()是和cop3= copy.copy(origin)的【值】是一样的(相当于一个字的楷体和宋体的写法),之所以cop1 is cop3 为False,是因为【内存地址】(不知道这样理解对吗)不一样造成的是吧。
 楼主| sundiom 发表于 2021-7-29 23:04
从零学习的歪经小 发表于 2021-7-29 21:29
卧槽,我学小半年,这模块咋没见过。。

学的基础资料不一样吧,慢慢学吧
 楼主| sundiom 发表于 2021-7-29 23:04
anandyuan 发表于 2021-7-29 22:29
对,浅copy:复制父对象,子对象仍然使用引用的方式。深copy:复制了对象和对象的所有子对象。

感谢解惑,最后问下(新变量) cop1 = origin.copy()是和cop3= copy.copy(origin)的【值】是一样的(相当于一个字的楷体和宋体的写法),之所以cop1 is cop3 为False,是因为【内存地址】(不知道这样理解对吗)不一样造成的是吧
thepoy 发表于 2021-7-29 23:50
sundiom 发表于 2021-7-29 23:04
感谢解惑,最后问下(新变量) cop1 = origin.copy()是和cop3= copy.copy(origin)的【值】是一样的(相当于一 ...

不论是深还是浅,复制的目的都是重新开辟一块内存来保存新的变量。新的内存中保存的变量可能是新的值,也可能仍然是对另一块内存的引用。
这也是深浅拷贝的区别。
通常,浅拷贝就是意思一下,将表面的值复制到新的内存空间中,原来变量中的引用在拷贝后的变量中仍然是引用。
深拷贝,就是将所有的东西都以值的形式拷贝到新的内存空间中。
只是要拷贝,内存地址一定不一样。
Tamluo 发表于 2021-7-30 00:05
谢谢,刚好也遇到这问题了,进来学一下
anandyuan 发表于 2021-7-30 12:11
sundiom 发表于 2021-7-29 23:04
感谢解惑,最后问下(新变量) cop1 = origin.copy()是和cop3= copy.copy(origin)的【值】是一样的(相当于一 ...

先来这样看

1
>>> a=[1,2]
>>> b=a
>>> a is b
True
2
>>> a = [1,2]
>>> b = a.copy()
>>> c = a.copy()
>>> b is c
False
3
>>> a = [1,2]
>>> a.copy() is a.copy()
False
4
>>> a = [1,2]
>>> b = a.copy()
>>> c = b
>>> b is c
True
1234综合比较:变量指向一个对象的内存地址,b=a就是让b也指向a的内存地址;当对象每次执行copy方法时都会产生新的内存地址;

然后再接着看

5
>>> import copy
>>> 
>>> a =[1,2,[3,4]]
>>> b = a.copy()
>>> c = copy.copy(a)
>>> b[2][0]=33
>>> b
[1, 2, [33, 4]]
>>> c[2][0]=33
>>> c
[1, 2, [33, 4]]
>>> b == c
True
>>> b is c
False

以上可以看出两种copy都是浅复制

关于copy()和copy.copy(),我也没查到他们的区别与联系,但我个人觉得他们既然都是浅复制,它们用起来应该效果是一样的,可能执行的过程也一样吧,不知道对不对,以上就是以人见解了

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 00:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表