python 模块 copy 复制详解

python 模块 copy 复制


1. copy()与deepcopy()

对于简单的 object,用shallow copy 和 deep copy 没区别;而对于复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。

import copy
from copy import deepcopy
origin = [1,2,[3,4]]
# origin里面有三个元素,1,2,[3,4]
copy1 = copy.copy(origin)
copy2 = deepcopy(origin)
print(copy1 == copy2)   # True
print(copy1 is copy2)   # False
# copy1 和copy2看上去相同,但已经不是同一个object
origin[2][0] = "hey!"
print(origin)   # [1, 2, ['hey!', 4]]
print(copy1)    # [1, 2, ['hey!', 4]]
print(copy2)    # [1, 2, [3, 4]]

可以看到 copy1,也就是 shallowcopy 跟着 origin 改变了。而 copy2 ,也就是 deepcopy 并没有变。可以看出deepcopy 更加符合我们对「复制」的直觉定义: 一旦复制出来了,就应该是独立的了。如果我们想要的是一个字面意义的「copy」,那就直接用deepcopy 即可。

2. 字典数据类型的copy

   字典数据类型的copy函数,当简单的值替换的时候,原始字典和复制过来的字典之间互不影响,但是当添加,删除等修改操作的时候,两者之间会相互影响。相当于上述的赋值操作,即在原来的对象的上面再贴上一个标签。

值替换(一级object,父对象),字典数组类型的copy函数复制的互不影响

a = {
    "name":["An","Assan"]
}
b = a.copy()

a["name"] = ["An"]

print(a)
print(b)
del a['name']
print(a)
print(b)
"""
{'name': ['An']}
{'name': ['An', 'Assan']}
{}
{'name': ['An', 'Assan']}
"""

值修改(二级object,子对象),字典数组类型的copy函数复制的互相影响

a = {
    "name":["An","Assan"]
}
b = a.copy()

a["name"].append("Hunter")

print(a)
print(b)
a['name'].remove('An')
print(a)
print(b)
"""
{'name': ['An', 'Assan', 'Hunter']}
{'name': ['An', 'Assan', 'Hunter']}
{'name': ['Assan', 'Hunter']}
{'name': ['Assan', 'Hunter']}
"""

如果想不改变原有被复制的值,则需要使用deepcopy,复制前后两个变量独立。

a = {
    "name":["An","Assan"]
}
b = deepcopy(a)
a["name"].append("Hunter")
print(a)
print(b)
"""
{'name': ['An', 'Assan', 'Hunter']}
{'name': ['An', 'Assan']}
"""

3. " = " 即一般意义的复制,浅复制

list1 = [1,2,[3,4]]
list2 = list1
list1.append(5)
print(list1)
# [1, 2, [3, 4], 5]
print(list2)
# [1, 2, [3, 4], 5]
list1[2].remove(3)
print(list1)
# [1, 2, [4], 5]
print(list2)
# [1, 2, [4], 5]

4. 列表切片等价于深复制

list1 = [1,2,[3,4]]
list2 = list1[:]
list1.append(5)
print(list1)
# [1, 2, [3, 4], 5]
print(list2)
# [1, 2, [3, 4]]
list1[2].remove(3)
print(list1)
# [1, 2, [4], 5]
print(list2)
# [1, 2, [4]]

参考链接:

  • 22
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Python的json模块提供了一些方法来处理JSON数据。其中一些方法包括: 1. loads方法:这个方法用于将一个包含JSON文档的字符串反序列化为Python对象。它的语法是:`loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)`。\[2\] 2. load方法:这个方法用于将一个包含JSON文档的文件反序列化为Python对象。它的语法是:`load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)`。\[3\] 3. json.tool模块:这个模块提供了一个命令行工具,可以格式化和验证JSON数据。可以使用`python -m json.tool`命令来运行这个工具。可以使用`--sort-keys`选项来根据JSON数据的key的字典序重新排序输出。\[1\] 这些方法和工具可以帮助你在Python中处理JSON数据。 #### 引用[.reference_title] - *1* [Python中的JSON模块详解](https://blog.csdn.net/taiyangdao/article/details/78360002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [python json模块 超级详解](https://blog.csdn.net/weixin_39691968/article/details/109877936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ghostwritten

口渴,请赏一杯下午茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值