比较比较操作符 ‘==’ 表示比较对象间的值是否相等,而 ‘is’ 表示比较对象的标识是否相等,即他们是否指向同一个内存地址

比较操作符 ‘is’ 效率优于 ‘==’,因为 ‘is’ 不能被重载,执行 ‘is’ 操作只是简单的获取对象的 id,并进行比较,而 ‘==’ 操作符则会递归的遍历对象的所有值,并逐一比较。

浅拷贝浅拷贝中的元素,是原对象中子对象的引用,因此,如果原对象中的元素是可变的,改变其他也会影响拷贝后的对象,存在一定的副作用。

l1 = [[1, 2], (30, 40)]

l2 = list(l1)

l1.append(100)

l1[0].append(3)

l1

[[1, 2, 3], (30, 40), 100]

l2

[[1, 2, 3], (30, 40)]

l1[1] += (50, 60)

l1

[[1, 2, 3], (30, 40, 50, 60), 100]

l2

[[1, 2, 3], (30, 40)]

在这个例子中,我们先初始化了一个列表 l1,里面的元素是一个列表和一个元组;然后对 l1 执行浅拷贝,赋予 l2,因为浅拷贝里的元素是对原对象元素的引用,因此 l2 中元素和 l1 指向同一个列表和元组对象。

l1.append(100),表示对 l1 列表新增元素 100,这个操作不会影响 l2,因为 l1 和 l2 作为整体是两个不同的对象,并不共享内存,操作过后 l2 不变,l1 会发生改变。

l1[0].append(3) 表示对 l1 中的第一个列表新增元素 3,因为 l2 是 l1 的浅拷贝,l2 中的第一个元素和 l1 中的第一个元素,共同指向同一个列表,因此 l2 中的第一个列表也会相应新增元素 3,操作后 l1 和 l2 都会改变。

最后是l1[1] +=(50,60),因为元组是不可变的,这里表示对 l1 中的第二个元组拼接,然后重新创造了一个新元组作为 l1 中的第二个元素,而 l2 没有引用新元组,因此 l2 并不受影响,操作后 l2 不变,l1 发生改变。

深拷贝

深拷贝则会递归地拷贝原对象中的每个子对象,因此拷贝后的对象和原对象互不相关,另外,深拷贝会维护一个字典,记录已经拷贝的对象及其 ID,来提高效率并防止无止境的递归发生。

import copy

l1 = [[1, 2], (30, 40)]

l2 = copy.deepcopy(l1)

l1.append(100)

l1[0].append(3)

l1

[[1, 2, 3], (30, 40), 100]

l2

[[1, 2], (30, 40)]

deepcopy()源码

def deepcopy(x, memo=None, _nil=[]):

"""Deep copy operation on arbitrary Python objects.

See the module's __doc__ string for more info.

"""

if memo is None:

memo = {}

d = id(x) # 查询被拷贝对象x的id

y = memo.get(d, _nil) # 查询字典里是否已经存储了该对象

if y is not _nil:

return y # 如果字典里已经存储了将要拷贝的对象,则直接返回

...

思考

import copy

x = [1]

x.append(x)

y = copy.deepcopy(x)

# 以下命令的输出是?

x == y

Traceback (most recent call last):

File "", line 1, in

RecursionError: maximum recursion depth exceeded in comparison

因为 x 是一个无限嵌套的列表,y 深度拷贝 x 也是一个无限嵌套的列表,理论上 x == y 应该返回 true,但是 x == y 内部执行是会递归遍历列表内部的,由于无限嵌套,因此报错。

python拷贝对象_Python对象的比较、拷贝相关推荐

  1. python结构体_Python对象初探

    欢迎关注微信公众号--Python与统计分析,一起学习,一起交流. 相信所有学过Python的人都听过这样一句话:Python中,一切皆对象.一个整数是一个对象,产生这个整数的类int也是一个对象.函 ...

  2. python中shelf对象_Python对象持久化存储工具pickle

    Python 中有个序列化过程称为pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化.也就是说,pickle 可以实现 Python 对象的存储及恢复. 序 ...

  3. js字符串怎么转python对象_python对象与json相互转换的方法 python中怎么把json对象转成字符串...

    在python中 如何实现将一个json字符串转化为对象 对象?json不能包含对象, 只能包含基本的数据类型, 键值对, 列表, 数字, 字符串等等 import jsond = {"k& ...

  4. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  5. python中字典的value可以为任意对象_Python对象作为字典值

    所以我有以下代码,其中字典的值是一个对象,该对象的关键是对象中的一个项目: class MyObject(): def getName(self): return self.name def getV ...

  6. python基本对象_python对象之对象基础1

    所有的 Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数 id()来得到. 这个值可以被认为是该对象的内存地址.您极少会 ...

  7. python切片的对象_Python 对象切片

    对对象进行切片 s[a:b:c] 的形式对 s 在 a 和 b 之间以 c 为间隔取值. c 的值还可以为负, 负值意味着反向取值. >>> s = 'bicycle' >&g ...

  8. python对象_Python对象()

    python对象 Python object() function returns a new featureless object. Python is an object-oriented pro ...

  9. python object类型转换_python对象类型转换

    我一直在尝试搜索如何在python中传递对象引用,并像Java一样对其进行类型转换,但没有成功.我不知道这个话题是否存在. 我的问题是必须将对象引用传递给类构造函数.但我不知道如何将引用类型转换为对象 ...

  10. python中如何创建类的对象_python面向对象中如何建立具体的对象?

    我们现在眼前所能看到的事物,都是具体的对象.很多小伙伴在面向对象中创建对象,其实都停留在对象名称的建立,计算机中并没有具体对象的描述属性.我们想要使用python中的类,建立的对象就需要是具体的.下面 ...

最新文章

  1. 支持placeholder和自适配高度的TextView控件
  2. 【树莓派】制作树莓派最小镜像:img裁剪瘦身
  3. cxf生成客户端代码
  4. Nacos 1.0.0 GA,架构、功能与 API 设计全面重构
  5. openstack代码解读之 neutron.agent.linux.iptables_manager模块
  6. Codeforces Round #395 (Div. 2)(未完)
  7. 深入理解 Vuejs 动画效果
  8. Failed to start SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularl
  9. 《C++语言入门经典》一第3章 重要的逻辑工具——判断与循环 3.1 条件判断...
  10. docker 安装mysql_docker|docker安装mysql数据库
  11. 一次openresty http.lua 性能调优之旅
  12. FastGitHub for Mac(GitHub下载扩展工具)
  13. C3P0组件+DbUtils组件实现一个JdbcUtils工具类
  14. 宋宝华: 一图理解终端、会话、 进程组、进程关系
  15. 【2023秋招面经】兴业数金面试总结
  16. 【手游脚本】触动精灵制作脚本
  17. 2022年10月 使用win11系统自带远程桌面,远程控制VMware虚拟机系统
  18. virtual box和centos问题杂记(一)
  19. #swust oj971 和972统计利用先序遍历创建的二叉树的深度和宽度
  20. DBCO-PEG9-NH2_2353409-99-9 点击化学 PEG 试剂

热门文章

  1. 巴斯夫如何找到清洁餐具的秘密
  2. Linux命令学习 - vi使用详解
  3. 信用贷款有5大误区,你都知道哪些?
  4. 区块链资讯 央行发布法定数字货币
  5. maven自定义厂库的安装与配置
  6. 数据科学家10条必备原则
  7. ML 训练与测试数据不满足同分布 - 如何检测?如何解决?
  8. Subversion Edge管理员密码找回
  9. 攻防世界 re1 wp
  10. 抖音艺术签名小程序源码/艺术签名设计小程序源码/字节跳动小程序开发