【Python】如何选择赋值和拷贝

在Python中,一切皆为对象,对象通过「变量名」引用,「变量名」更确切的叫法是「名字」,好比我们每个人都有自己的名字一样,我们通过名字来代指某个人,代码里面通过名字来指代某个对象。

变量赋值就是给对象绑定一个名字,赋值多出一个对象。好比出生的时候父母给我们取了一个大名后,再取一个小名并不来多出一个人来,只是多一个名字罢了。

对象赋值

两个对象做比较有两种方式,分别是:is与 == ,is比较的是两个对象是否相同,通过对象的ID值可识别是否为相同对象,==比较的是两个对象的值是否相等。
x1 = [1,2,1]
x2 = [1,2,1]
print(x1 is x2)
print(x1 == x2)
print(id(x1))
print(id(x2))
False
True
2004573077256
2004573077448
上面我们对x1和x2进行赋值,相对于给两个变量分别取了名字x1和x2,两个名字虽然都是列表[1,2,1],但在内存中是两个独立的不同的对象,占据不同的内存空间,就好比两个名字一样的人,实则为两个不同的人。
x3 = x2
print(x2 is x3)
True
上面我们将x2对应的对象绑定了一个新的名字叫x3,这就好比一个人,开始给他取了一个x2的大名,后来又给他取了一个x3的小名,本质上还是同一个人,所以,x2和x3所指的其实是同一个对象。
通过x2修改对象时,x3也会跟着变化,因为本质上它们是同一个对象,这就好比一个人大名x2,小名x3,x2长了一岁相对于x3也长了一岁。
x2.append(2)
print(x2)
print(x3)
[1, 2, 1, 2]
[1, 2, 1, 2]

但是,当我们给x2重新赋值时,相当于x2不再引用之前的对象,而引用新对象,x3依然引用之前的对象。好比一个人的大名x2和小名x3,给x2重新赋值就相当于给另外一个人取大名x2,但是x3还是开始那个人的小名。

x2 = [3,4,3]
print(x2)
print(x3)
[3, 4, 3]
[1, 2, 1, 2]


对象拷贝

有时我们需要复制一个对象,但是又不想对原对象产生副作用,肯定不能通过赋值给一个新变量来解决(因为赋值会对新变量产生影响),所以 Python专门提供了一种拷贝机制,基于原对象快速创建出一个含有相同值的对象。该功能由copy模块提供。
import copy
拷贝又分为浅拷贝和深拷贝。
a = [1,2,1]
ac = copy.copy(a)       #浅拷贝
adc = copy.deepcopy(a)  #深拷贝
print(ac)
print(adc)
拷贝出来的对象只是值相同,实为不同的对象
print(a == ac ==adc)
print(a is ac)
print(a is adc)
True
False
False

拷贝出来的对象不在受原来对象的影响

a.append(2)
print(a)
print(ac)
print(adc)
[1, 2, 1, 2]
[1, 2, 1]
[1, 2, 1]

那么浅拷贝(shallow copy)与深拷贝(deep copy)有什么区别呢?

对于不可变对象,比如整数、字符串、元组、还有由这些不可变对象组成的集合对象,浅拷贝和深拷贝没有区别,都是拷贝一个新对象。

两者的区别在于拷贝组合对象,比如列表中还有列表,字典中还有字典或者列表的情况时,浅拷贝只拷贝了外面的壳子,里面的元素并没有拷贝(里面的元素还是引用旧对象),而深拷贝则是把壳子和里面的元素都拷贝了一份新的。

x = [[5,6],[6,7],[7,2] ,[2,5] ,[4,9]]
xc = copy.copy(x)       #浅拷贝
xdc = copy.deepcopy(x)  #深拷贝
print(x[0] is xc[0])
print(x[0] is xdc[0])
True
False

我们可以通过下面看到列表中的列表在浅拷贝时会受列表中列表变化而改变


x[0].remove(5)
print(x)
print(xc)
print(xdc)
[[6], [6, 7], [7, 2], [2, 5], [4, 9]]
[[6], [6, 7], [7, 2], [2, 5], [4, 9]]
[[5, 6], [6, 7], [7, 2], [2, 5], [4, 9]]

浅拷贝只拷贝了x的对象外壳,里面的列表还是引用x里面列表的对象,深拷贝即拷贝了x的对象外壳,而且里面的列表的对象也拷贝了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式Session共享问题解决

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请注明出处(如不注明,盗者必究&#xf…

【Python】元组和列表相关知识总结

python中,我们经常用到元组和列表,本文主要总结了一下元组和列表的一些基本用法。 #作者:cacho_37967865 #博客:https://blog.csdn.net/sinat_37967865 #文件:teamList.py #日期:2018-05-06 #备注&#xf…

python 写入json数据到数据库

json数据格式: # json格式数据 data{"camera": {"created": "1531925035","type": 1,"description": "A bridge is a structure that is built over a railway, river, or road so that people or vehicle…

❤️震惊!人生苦短,我用python来玩田忌赛马❤️

一读标题笑死自己哈哈哈,最近猪哥(玩得敲好的彭友)找我帮忙解决他不会作业哈哈哈,他们公司自己出的笔试题哈哈哈,希望别被他们出题人看见哈哈哈,回想猪哥说的一句话,万一这就是以后你遇到的试题…

【测试】软件测试 QA、QC、QM的关系与区别?

质量体系之:软件测试 QA、QC、QM的关系与区别? 关键词:QA是未雨绸缪,测试是亡羊补牢 经常看到有些人把QA、QC、QM的概念搞混,认为他们是同一个概念的不同描述,由于这三者都是舶来品,并且翻译者在…

错误之data_insertt() takes 1 positional argument but 2 were given解决方法

1、首先检测函数与调用直接的参数是否匹配。 2、若为python环境。 函数定义如下: 调用如下: 显示如下错误: 解决方法:在函数定义时添加self。即为: 则问题解决。 这是一个很基本的,但是很严重的错误。只…

【测试】优秀软件测试工程师必备的8个能力

作为一名软件工程师,需要的能力并不多,但是要成为一名优秀的软件测试工程师,需要的能力就比较多了。 一、业务分析能力 1、分析整体业务流程 不了解整个公司的业务,根本就没办法进行测试。 2、分析被测业务数据 了解整个业务里…

python将Unix时间戳转换成时间

将时间戳转换成时间 在时间戳转换成时间中,首先需要将时间戳转换成localtime,再转换成时间的具体格式: 利用localtime()函数将时间戳转化成localtime的格式利用strftime()函数重新格式化时间 #coding:UTF-8 import timetimestamp 15324990…

【Python爬虫】爬虫程序的简单处理过程

一月份的时候有写过一篇文章,是关于如何解析网站,然后将图片下载下来,爬虫爬取美女图片存入到动态的文件夹中 今天主要总结的是爬虫的一个基本思路,主要有: 1.获取一个网页get_one_page() 我们知道一个网页可能由多个…

错误之Only one usage of each socket address (protocol/network address/port)解决办法

错误如下: 解决方案:这个错误是端口占用导致。我们应找到此应用程序对应端口号的pid然后kill掉,即可ok

【测试】用例设计思路-六方面

有这样一个面试题:在一个Web测试页面上,有一个输入框,一个计数器(count)按钮,用于计算一个文本字符串中字母a出现的个数。 请设计一系列测试用例用以测试这个Web页面。 有经验的测试人员可能会问面试官&…

Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'

code: 1 #encodingutf-82 from django.db import models3 # Create your models here.4 class BookInfo(models.Model): #创建书本信息类,继承models.Model5 booktitlemodels.CharField(max_length20)6 bookdatamodels.DateField()7 class HeroInfo(model…

【职场】高薪的条件你满足几条?

生活中时常听到人们抱怨工资少,但是抱怨归抱怨,你是否意识到自身的一些问题呢?高薪的条件你又满足几条一、忠诚 单位可能开除有能力的员工,但对一个忠心耿耿的人,不会有领导愿意让他走,他会成为单位这个铁打…

【Excel】函数DateDif查看两个日期之间的间隔

Excel中的DateDif函数是一个隐藏函数,在excel的公式以及帮助中是找不到的,必须要手工输入才可以。 此函数的格式为datedif("开始日期","结束日期","参数"),说明如…

跟老齐学python Django实战第一章错误解决

我使用的是 Django 2.0 版本,在按第一章所说的做,出现了三个大问题,并找了答案,现在贴上来,希望能给大家小小帮助: 1) 写 models.py 的时候,执行“python manage.py makemigrations …

【技巧】搜狗输入法特殊技巧

有时候我们报销或者其他情况下需要对金额进行大写,这时我们可以通过搜狗输入法进行转换;阅读的时候,我们会遇到一些特殊而且复杂的字,这个时候我们也可以通过搜狗输入法知道这个字怎么读。 先下载搜狗拼音输入法: 数字金额进行转换…

【商业】梳理你的商业模式

商业模式一直是一个好像每个人都能说两句,但是总也说不清楚的话题。 商业模式是企业的立身之本,也是企业的本质和核心。商业模式是人们商业智慧的集中体现,也是商业中最令人兴奋的部分。在商业模式的背后,有着太多的成功与失败、欢…

Django View和URL

网页程序的逻辑:request进来 -> 从服务器获取数据 -> 处理数据 -> 把网页呈现出来 url 设置相当于客户端向服务器发出request请求的入口,并用来指明要调用的程序逻辑 views 用来处理程序逻辑,然后呈现到template(一般为…

Django配置bootstrap

1、下载bootstrap文件。https://getbootstrap.com/docs/3.3/getting-started/ 下载的文件夹可以看出有css、fonts、js三个文件,这就是Bootstrap 3的全部 2、 自定义静态文件(css,js,image)位置 根目录下新建 static…

同步与异步以及线程与进程

写过爬虫的都知道,爬虫的性能瓶颈在于IO,因为爬虫是一个IO密集型业务,程序需要发起网络请求,必然就有IO阻塞, 通常请求一个URL耗时要几百毫秒到几秒不等,而我们的CPU处理速度惊人,两者的速度就好…