sundiom 发表于 2021-7-29 19:53

python入门copy疑惑求解

本帖最后由 sundiom 于 2021-7-31 22:02 编辑

学习基础《Python编程快速上手-让繁琐工作自动化》先上示例代码
import copy
origin = ]
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)

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

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

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

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



从零学习的歪经小 发表于 2021-7-29 21:29

卧槽,我学小半年,这模块咋没见过。。{:301_999:}

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=
>>> b=a
>>> a is b
True
```
#### 2
```
>>> a =
>>> b = a.copy()
>>> c = a.copy()
>>> b is c
False
```
#### 3
```
>>> a =
>>> a.copy() is a.copy()
False
```
#### 4
```
>>> a =
>>> b = a.copy()
>>> c = b
>>> b is c
True
```
#### 1234综合比较:变量指向一个对象的内存地址,b=a就是让b也指向a的内存地址;当对象每次执行copy方法时都会产生新的内存地址;
### 然后再接着看
#### 5
```
>>> import copy
>>>
>>> a =]
>>> b = a.copy()
>>> c = copy.copy(a)
>>> b=33
>>> b
]
>>> c=33
>>> c
]
>>> b == c
True
>>> b is c
False
```
### 以上可以看出两种copy都是浅复制
### 关于copy()和copy.copy(),我也没查到他们的区别与联系,但我个人觉得他们既然都是浅复制,它们用起来应该效果是一样的,可能执行的过程也一样吧,不知道对不对,以上就是以人见解了
页: [1] 2
查看完整版本: python入门copy疑惑求解