GeekTop
  • 首页
  • 关于

GeekTop

不止代码

Python 中的 deepcopy 和 copy

Python 中的 deepcopy 和 copy

2016年7月20日 Alex Comments 0 Comment

最近深入研究了一下 Python 对象的复制机制,这里发表一下。

Python 与 C++ 的对比

Python 中的 deepcopy 有点类似于 C++中的 复制构造函数,只不过 Python 中的 deepcopy 要比 C++ 中的复制构造函数简单的多的多。

在 C++ 中有三大函数: 默认构造函数、复制构造函数、析构函数,如果一个对象中用到了堆内存,如果要实现这个对象的正常拷贝,那么这个类必须实现 复制构造函数 与 =操作符重载。并且这个地方,也是 C++ 的一个难点,幸好 Python 已经内置了实现对象拷贝的方法。

示例代码

用一段代码来说明 deepcopy 与 copy 的区别:

import copy

class Tree:
    def __init__(self, age=None, high=None, name=None):
        self.age = age
        self.hight = high
        self.name = name
        self.func = []

## example of copy
T1 = Tree(12, 15, 'oak')
T1.func.append('desk')

print(T1.age, T1.hight, T1.name, T1.func)

T2 = copy.copy(T1)

T2.func.append('bed')
T2.age = 10

print("T1:", T1.age, T1.hight, T1.name, T1.func)
print("T2:", T2.age, T2.hight, T2.name, T2.func)

## example of deepcopy
T3 = Tree(10, 12, 'palm')
T3.func.append('oil')

print(T3.age, T3.hight, T3.name, T3.func)

T4 = copy.deepcopy(T3)

T4.func.append('shadow')
print("T3:", T3.age, T3.hight, T3.name, T3.func)
print("T4:", T4.age, T4.hight, T4.name, T4.func)

代码输出结果:

> 12 15 oak ['desk']
> T1: 12 15 oak ['desk', 'bed']
> T2: 10 15 oak ['desk', 'bed']
> 10 12 palm ['oil']
> T3: 10 12 palm ['oil']
> T4: 10 12 palm ['oil', 'shadow']

可以看到,不管是 copy 还是 deepcopy 都会构造一个新的对象,但是,遇到引用,deepcopy 会继续复制引用的内容。从上例可以看出,copy 并没有把列表复制一份,而只是用了原来列表的引用。


编程
Python

Post navigation

NEXT
如何写出简洁优雅的代码
PREVIOUS
PostgreSQL 里存储 pandas 数据帧时指定列的类型

发表回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

最近文章

  • 姥姥
  • 设计一个可扩展的用户模型
  • 使用 Apple 的 Keychain 保存 SSH 的 passphase
  • 解决 ABA 问题
  • 关于 macOS 上面部分 emoji 无法显示的问题
  • 这些年我技术栈的变化
  • 搬瓦工、狗云、hostodo、oracle对比测试
  • Google Drive 无法上传文件
  • 使用 socks5 代理 git ssh 协议
  • 到底要不要“润”
  • 可复用的代码
  • 关于疫情的一点点反思
  • 我的风控策略(投资篇)
  • 我的风控策略(生活篇)
  • Spring Boot是如何处理异常的
  • 编码与解码
  • 基于统计的图像目标检索
  • 有限状态机和状态模式
  • API安全设计
  • 用户密码的存储策略

近期评论

  • ǝɔɐǝԀʎzɐɹϽ发表在《可复用的代码》
  • Alex发表在《可复用的代码》
  • ǝɔɐǝԀʎzɐɹϽ发表在《到底要不要“润”》
  • ǝɔɐǝԀʎzɐɹϽ发表在《可复用的代码》
  • ǝɔɐǝԀʎzɐɹϽ发表在《我的风控策略(生活篇)》
  • ǝɔɐǝԀʎzɐɹϽ发表在《如何写出简洁优雅的代码》
  • 张志亮发表在《如何写出简洁优雅的代码》

分类

  • AI (2)
  • Java应用安全之道 (1)
    • 加密与解密 (1)
  • Odoo (2)
  • Python (1)
  • 图像处理 (1)
  • 年鉴 (1)
  • 数据库 (10)
  • 编程 (14)
    • Spring (1)
  • 读书笔记 (2)
  • 运维 (5)
  • 随笔 (10)

归档

  • 2023年1月 (2)
  • 2022年8月 (1)
  • 2022年7月 (4)
  • 2022年6月 (2)
  • 2022年5月 (2)
  • 2022年4月 (3)
  • 2021年10月 (1)
  • 2021年7月 (1)
  • 2021年5月 (1)
  • 2020年11月 (1)
  • 2020年7月 (1)
  • 2020年3月 (2)
  • 2020年2月 (1)
  • 2019年1月 (1)
  • 2018年12月 (2)
  • 2018年11月 (2)
  • 2017年4月 (1)
  • 2016年11月 (1)
  • 2016年9月 (1)
  • 2016年7月 (1)
  • 2016年5月 (3)
  • 2016年4月 (2)
  • 2016年3月 (1)
  • 2016年2月 (2)
  • 2015年12月 (1)
  • 2015年11月 (2)
  • 2015年8月 (1)
  • 2015年4月 (1)
  • 2015年3月 (1)

标签

Database devops Java MySQL PostgreSQL Python shell Spring SpringBoot Spring Security 安全 年鉴 总结 编程 随笔
© 2015-2023   Geektop.net All Rights Reserved.