python 模块 copy 复制详解

简介: 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]]

参考链接:

相关文章
|
10天前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
49 4
|
1月前
|
存储 安全 数据处理
Python 内置模块 collections 详解
`collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
102 0
|
2月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
|
5月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
234 14
|
9月前
|
Python
Python Internet 模块
Python Internet 模块。
210 74
|
6月前
|
人工智能 自然语言处理 Shell
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
84 8
|
6月前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 "hello world!" 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
102 5
|
10月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
266 63
|
7月前
|
Python API 监控
将Python CLI工具发布为pip模块的完整指南
注册PyPI账户 访问PyPI官网注册账户 推荐使用双因素认证增强安全性 生成API令牌 访问PyPI账户管理 生成具有"Upload packages"权限的令牌,妥善保存 确保模块名唯一性 在PyPI搜索页面验证模块名未被使用 建议使用小写字母和连字符的组合(如my-cli-tool)
146 9
|
8月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
103 3

推荐镜像

更多