鱼C论坛

 找回密码
 立即注册
查看: 999|回复: 6

[已解决]第026讲:字典:当索引不好用时2 | 课后测试题 里关于copy()的用法的讲解

[复制链接]
发表于 2018-7-29 12:05:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
5. 如果你需要将字典dict1 = {1: 'one', 2: 'two', 3: 'three'}拷贝到dict2,你应该怎么做?

答:可以利用字典的copy()方法:dict2 = dict1.copy(),在其他语言转移到Python小伙伴们刚开始可能会习惯性的直接用赋值的方法(dict2 = dict1),这样子做在Python中只是将对象的引用拷贝过去而已。
这里的“这样子做在Python中只是将对象的引用拷贝过去而已。”是指copy()全拷贝,还是指赋值“=”,这里我不清楚,请各位大神指点下...

>>> a = {1:'one', 2:'two', 3:'three'}
>>> b = a.copy()
>>> c = a
>>> c[4] = 'four'
>>> c
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> a
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
>>> b
{1: 'one', 2: 'two', 3: 'three'}
最佳答案
2018-7-29 12:08:53
http://bbs.fishc.org/thread-118923-1-1.html
copy拷贝值,'='拷贝对象。
Opera Snapshot_2018-07-29_115156_bbs.fishc.org.png
Opera Snapshot_2018-07-29_115156_bbs.fishc.org.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-29 12:08:53 | 显示全部楼层    本楼为最佳答案   
http://bbs.fishc.org/thread-118923-1-1.html
copy拷贝值,'='拷贝对象。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 12:37:06 | 显示全部楼层
“这样子做在Python中只是将对象的引用拷贝过去而已。” 是指赋值“=”
Python中的赋值“=”是通过引用传递的,比如a=b,就像把a指向的对象又添加了一个标签b,b也指向这个对象。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 14:53:09 | 显示全部楼层
这里的这样子做
是指
用=号赋值的时候,是直接拷贝的引用
楼主可以用id(d)去看 用=操作后的两个变量的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-30 10:13:04 | 显示全部楼层
安静的待一会 发表于 2018-7-29 12:37
“这样子做在Python中只是将对象的引用拷贝过去而已。” 是指赋值“=”
Python中的赋值“=”是通过引用传 ...

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-30 11:08:06 | 显示全部楼层
无符号整形 发表于 2018-7-29 12:08
http://bbs.fishc.org/thread-118923-1-1.html
copy拷贝值,'='拷贝对象。

受教了,还想问下,既然 “=” 赋值是一个变量的不同标签,比如
>>> myDict = {1, 2, 3, "清明"}
>>> myDict2 = myDict
>>> myDict = {}
>>> myDict2
{1, 2, 3, '清明'}}
为什么,myDict2 没有被清空啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-30 12:55:20 | 显示全部楼层
我又去看看相关的资料 整理了如下
>>> list1 = [1,2,3]
>>> list2 = list1.copy()
>>> list1[0] = 0
>>> print(list1)
[0, 2, 3]
>>> print(list2)
[1, 2, 3]

也可以使用内置函数 id() ,发现 list1和 list2 指向内存中同一个对象
>>> list1 = [[1, 2,], 3, '清明']
>>> list2 = list1.copy()
>>> list1[0][0] = 5
>>> print(list1)
[[5, 2], 3, '清明']
>>> print(list2)
[[5, 2], 3, '清明']
>>> list1.append(10)
>>> print(list1)
[[5, 2], 3, '清明', 10]
>>> print(list2)
[[5, 2], 3, '清明']

>>> list1 = [[1, 2,], 3, '清明']
>>> list2 = list1[:]
>>> list1[0][0] = "蝶恋花"
>>> print(list1)
[['蝶恋花', 2], 3, '清明']
>>> print(list2)
[['蝶恋花', 2], 3, '清明']
>>> list1 = [[1, 2,], 3, '清明']
>>> list2 = list1[:]
>>> list1[0][0] = "对父对象的子对象进行更改"
>>> print(list1)
[['对父对象的子对象进行更改', 2], 3, '清明']
>>> print(list2)
[['对父对象的子对象进行更改', 2], 3, '清明']
>>> list1.append("对父对象进行更改")
>>> print(list1)
[['对父对象的子对象进行更改', 2], 3, '清明', '对父对象进行更改']
>>> print(list2)
[['对父对象的子对象进行更改', 2], 3, '清明']

赋值不是浅拷贝。
赋值:对象的引用(别名)。用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个“标签”而已。对象赋值实际上是对象的引用。当创建一个变量,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。如果原始对象的父对象改变,而子对象不变,拷贝得到的父对象不会跟着改变;如果原始对象的父对象里的子对象改变,则拷贝得到的父对象的字对象也会跟着改变。(浅拷贝:拷贝组合对象,不拷贝子对象)
常见的浅拷贝有:切片操作(mylist2 =mylist1[:])、工厂函数、对象的copy()方法(mylist2 =mylist1.copy())、copy模块中的copy函数

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。原始对象的改变不会造成深拷贝里任何子元素的改变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-4-1 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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