本文适合阅读对象:已学完Python基础课程,并能熟练使用Python基本用法编程。如果还有一些其他语言的基础最好不过了,如果没有Python基础或者正在学习中,请点击以下链接:

Python基础教程

一、对象比较:is与==

达恩·巴德尔在令其声名大噪的《Python T'ricks》一书中,举了一个经典的双胞胎猫的例子,邻居家有一对双胞胎猫,两只猫看起来完全相同,除非个性上的小癖好,单从外表无法区分,尽管看起来完全一样,但它们依然是两只不同的猫。因此,大家就知道,相等和相同二者之间是有所区别的。

==操作符是比较相等性的,用==来比较那两只猫,得到的答案是“两只猫是一样的”;is操作符是比较相同性,用is来比较那两只猫,得到的答案是“两只猫不是同一只猫”。

a=['a','b','c']

b=list(a)

print(a==b)

def test(t):

   return a is t

print(test(b))

c = a

print(test(c))

结果如下:

print(a==b)的结果是True,没毛病,二者相等;a is b的结果是False,原因是它们没有指向一个对象,对已有列表d调用list(),创建了一个名为b的副本;a is c的结果是True,原因是它们指向同一个对象。

二、克隆对象

由上面的例子大家发现,Python中的赋值语句不会创建对象的副本,而只是将名字绑定到对象上。但有些场景下,大家需要用到对象的副本,以便修改副本时不会改动本体。那么如何在Python中复制或克隆对象呢?先来看看Python的内置容器(列表、字典、集合)如何复制,如下所示:

new_list = list(old_list)

new_dict = dict(old_list)

new_set = set(old_list)

但是用这种方法无法复制自定义的对象,并且最重要的是这种方法只创建浅副本。浅复制和深复制之间有重要区别,特别对于像列表、字典、集合这样的复合对象而言。

1. 浅复制是指构建一个新的容器对象,然后填充原对象中子对象的引用。本质上浅复制只执行一层,复制过程不会递归,不会创建子对象的副本。

2. 深复制是递归复制,首先构造一个新的容器对象,然后递归地填充原始对象中子对象的副本,这种方式会遍历整个对象树,以此创建了与原对象及其所有子项完全独立的副本。

三、浅复制

xs = [[1,2,3],[4,5,6],[7,8,9]]

ys = list(xs)#浅复制

ys现在是一个新的独立对象,与xs有相同内容,大家可以打印查看这两个对象确认一下:

但是由于前面只是创建了原列表的浅副本,所以ys仍然含有xs子对象的引用。这些子对象没有复制,只是在ys中再次引用。因此在修改xs中的子对象时,这些改动也会被反映在ys中:因为两个列表共享相同的子对象。这个副本是仅含有一层的浅复制。

xs[1][0] = 'X'

print(xs)

print(ys)

四、深复制

修改上面的列表浅复制示例,这次使用copy模块中定义的deepcopy()函数创建深副本:

import copy

xs = [[1,2,3],[4,5,6],[7,8,9]]

zs = copy.deepcopy(xs)#深复制

在查看xs及使用copy.deepcopy()创建的副本zs时,会发现和前面的示例相同,它们看起来都一样:

但如果修改原对象xs中的某个子对象,则会发现不同上面示例,这些修改不会影响深副本zs。现在原对象和副本是完全独立的。复制过程中递归复制了xs,包括它所有的子对象:

xs[1][0] = 'X'

print(xs)

print(zs)

大家看出来了不同了吗,顺便说一句,还可以使用copy模块copy.copy()函数创建对象的浅副本。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月20日

ThinkPHP5快速入门

ThinkPHP5快速入门目 录零、序言一、基础二、URL和路由三、请求和响应四、数据库五、查询语言六、模型和关联 (1)模型定义 (2)基础操作 (3)读取器和修改器 (4)类型转换和自动完成 (5)查询范围 (6)输入和验证 (7)关联 (8)模型输出七、视图和模板八、调试和日志九、API开发十、命令行工具十一、扩展十二、杂项SessionCookie验证

ThinkPHP5快速入门基础

ThinkPHP5快速入门基础一、基础快速入门 ( 一 ) :基础本章介绍了 ThinkPHP5 .0 的安装及基本使用 ,并给出了一个最简单的示例带你了解如何开始开发 ,主要包 含 :简介官网下载 omposer安装和更新CGit下载和更新目录结构运行环境入口文件调试模式控制器视图读取数据总结在学习 ThinkPHP5.0 之前 ,如果你还不理解面向对象和命名空间的概念 ,建议首先去PHP手册恶

热门专题

云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
弥勒综合高中|弥勒综合高中
弥勒综合高中
云南高职单招|云南单招,云南单招网,云南高职单招网,云南高职单招,云南单招学校,云南单招培训
云南高职单招
云南开放大学|云南开放大学报名,云南开放大学报考,云南开放大学,什么是云南开放大学,云南开放大学学历,云南开放大学学费,云南开放大学报名条件,云南开放大学报名时间,云南开放大学学历,云南开放大学专业
云南开放大学
小程序开发|微信小程序,小程序开发,小程序,小程序制作,微信小程序开发,小程序公司,小程序开发公司,分销,三级分销系统,分销系统
小程序开发
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专
大理科技管理学校|大理科技管理中等职业技术学校,大理市科技管理中等职业技术学校
大理科技管理学校

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部