"==" 与 is

  python 为 10 开辟内存空间, a与b同时指向这块内存,即a与b的值相等,a与b的id也相等.因此 a==b 与 a is b 都返回True:

a = 10
b = 10
print(a == b)
#True
print(id(a))
#
print(id(b))
#
print(a is b)
#True
  在[-5,256]范围内的整数会有上面代码的性能优化,而不在这范围内的数字就会重新开辟内存空间。

  【实验证明,下面代码只在终端中执行Python命令行时才有效,而在执行脚本时整型的数据都会分配同一个空间】
a = 257
b = 257
print(a == b)
#True
print(id(a))
#
print(id(b))
#
print(a is b)
#False
  元组虽是不可变类型,但如果嵌套了可变类型(list),那么元组就变成是可变的了
t1 = (1, 2, [3, 4])
t2 = (1, 2, [3, 4])
print(t1 == t2)
#True t1[-1].append(5)
print(t1 == t2)
#False

浅拷贝(shallow copy) 与 深拷贝(deep copy)

  浅拷贝

  使用数据类型本身的构造器,是浅拷贝

l1 = [1, 2, 3]
l2 = list(l1)
#l2
#[1, 2, 3] print(l1 == l2)
#True
print(l1 is l2)
#False s1 = set([1, 2, 3])
s2 = set(s1)
#s2
#{1, 2, 3} print(s1 == s2)
#True
print(s1 is s2)
#False

  切片也是浅拷贝

l1 = [1, 2, 3]
l2 = l1[:] print(l1 == l2)
#True
print(l1 is l2)
#False

  copy.copy()浅拷贝

import copy
l1 = [1, 2, 3]
l2 = copy.copy(l1)
print(l1 is l2)
#False

  对于元组,这些操作都是返回指向同一元组(1,2,3)的引用

import copy
t1 = (1, 2, 3)
#t2 = tuple(t1)
#t2 = t1[:]
#t2 = copy.copy(t1)
t2 = copy.deepcopy(t1) #如果元组中不只是原子类型,比如有list,dict就可以用deepcopy print(t1 == t2)
#True print(t1 is t2)
#True

  以下代码 l2 = list(l1)表示 l2 指向 l1浅拷贝生成的新对象, 而对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)

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

  由于l1与l2是两个指向不同的对象,所以 l1指向的列表增加元素不会改变 l2指向的列表

l1.append(100)
print(l1)
#[[1, 2, 3], (30, 40), 100]
print(l2)
#[[1, 2, 3], (30, 40)]

  由于浅拷贝对象中的元素是引用原始元素的内存地址,因此对于可变类型(list)增加了3,l2与l1中list的是同一个引用,因此也是[1,2,3]

l1[0].append(3)
print(l1)
#[[1, 2, 3], (30, 40), 100]
print(l2)
#[[1, 2, 3], (30, 40)]

  由于 tuple是不可变类型,因此修改后l1指向重新分配的一个新元组的引用。

l1[1] += (50, 60)
print(l1)
#[[1, 2, 3], (30, 40, 50, 60), 100]
print(l2)
#[[1, 2, 3], (30, 40)]

  深拷贝

  拷贝出来的新对象完全独立于原对象,修改操作与原对象互不影响

import copy
x = [1]
x.append(x)
print(x)
# [1, [...]] y = copy.deepcopy(x)
print(y)
# [1, [...]]
print(x is y) #False
print(x == y) #RecursionError: maximum recursion depth exceeded in comparison 递归错误

参考

  https://www.cnblogs.com/wilber2013/p/4645353.html

  极客时间《Python 核心技术与实战》专栏

  

Python进阶:对象复制与比较,分深浅,见真假的更多相关文章

  1. Python进阶 - 对象,名字以及绑定

    Python进阶 - 对象,名字以及绑定 1.一切皆对象 Python哲学: Python中一切皆对象 1.1 数据模型-对象,值以及类型 对象是Python对数据的抽象.Python程序中所有的数据 ...

  2. Python进阶 - 命名空间与作用域

    Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...

  3. Python进阶:自定义对象实现切片功能

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  4. Python - 面对对象(进阶)

    目录 Python - 面对对象(进阶) 类的成员 一. 字段 二. 方法 三. 属性 类的修饰符 类的特殊成员 Python - 面对对象(进阶) 类的成员 一. 字段 字段包括:普通字段和静态字段 ...

  5. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  6. 第五篇python进阶之深浅拷贝

    目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...

  7. Python进阶:切片的误区与高级用法

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  8. python进阶篇

    python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. ​ import sys ...

  9. python进阶强化学习

    最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类 ...

随机推荐

  1. docker nginx angular 刷新错误,404错误

    主要是router问题,两个解决方案 一个是修改angular项目的router选项,一个是修改Nginx的route 选项 一般情况下项目部署了,不愿意修改angular项目的router选项,所以 ...

  2. arts 打卡12周

    一 算法:  字符串转换整数 (atoi)   请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找 ...

  3. 【多线程与并发】Java并发工具类

    主要有两类 ①并发流程控制相关:CountDownLatch.CyclicBarrier.Semaphore ②线程间交换数据相关:Exchanger: CountDownLatch 作用:允许一个或 ...

  4. C#中使用typeof关键字和GetType()获取类的内部结构(反射机制)

    一.问题描述 java有反射机制,C#也有反射机制,在C#中typeof关键字用于获取类型的System.Type对象,该对象的GetMethods()方法可以得到类型中定义的方法对象的计集合,调用方 ...

  5. 查看 systemctl 崩溃日志 及 运行日志

    vi /var/log/syslog 查看指定服务的: grep "bx" /var/log/syslog

  6. 教你如何使用QBDI动态二进制检测框架

    工具介绍 QBDI 全名为 QuarkslaB Dynamicbinary Instrumentation,它是一个模块化的跨平台以及跨架构的 DBI 框架.该工具目前支持 Linux.macOS.A ...

  7. longitudinal models | 纵向研究 | mixed model

    A longitudinal study refers to an investigation where participant outcomes and possibly treatments o ...

  8. ubuntu上安装jdk

    使用安装包安装:JDK官网下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.h ...

  9. Flutter 中的常见的按钮组件 以及自定义按钮组件

    Flutter 里有很多的 Button 组件很多,常见的按钮组件有:RaisedButton.FlatButton. IconButton.OutlineButton.ButtonBar.Float ...

  10. Vue动态路由 Get传值

    <template> <!-- 所有的内容要被根节点包含起来 --> <div id="home"> 我是首页组件 <ul> < ...