"==" 与 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. Nginx:fastcgi_param详解

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ...

  2. MySQL5.7授权用户远程访问

    做个记录,每次弄环境的时候,特别是弄mysql环境,时不时都要用到下面的命令 命令如下: grant all privileges on *.* to 'root'@'%' identified by ...

  3. virtualBox虚拟机Ubuntu系统与主机Windows共享文件夹

    1.在virtualBox虚拟机中安装Ubuntu系统 2.打开虚拟机后,安装VirtualBox增强功能包(VBoxGuestAdditions),参照下图,如果确认已经安装就直接跳过至第4步. 3 ...

  4. Fish Lang

    fish lang是一门基于函数的,可定制语法的编程语言. 为什么要设计fish这门语言 目前的编程语言语法都是固定死的,无法很容易的移除一种语法.fish语言一切语法由函数定义,语言只提供一个函数的 ...

  5. NTC3950-10K温度传感器

    一.计算公式 补充: B=3950 R=10K T2=25度 查RT表,25度对应的是10K 电路: 热敏电阻与上拉电阻R813分压,获取温度与Vo电压的关系,在根据Vo折算出与MCU ADC的数值. ...

  6. 信息论 | information theory | 信息度量 | information measures | R代码(一)

    这个时代已经是多学科相互渗透的时代,纯粹的传统学科在没落,新兴的交叉学科在不断兴起. life science neurosciences statistics computer science in ...

  7. 天池移动推荐算法赛--https://github.com/PnYuan/Tianchi-BigData

    参考: https://blog.csdn.net/Snoopy_Yuan/article/details/75808006

  8. GCN: Graph Convolutional Network

    从CNN到GCN的联系与区别: https://www.zhihu.com/question/54504471/answer/332657604 更加详解Laplacian矩阵: https://ww ...

  9. Linux中进程的几种状态

    linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该状 ...

  10. npm install 时 No matching version found for react-flow-design@1.1.14

    执行 npm install时报错如下: 4017 silly pacote range manifest for react-highcharts@^16.0.2 fetched in 19ms40 ...