python中如何对多变量连续赋值


Posted in Python onJune 03, 2021

看到一段代码,如下

self.batch_size = batch_size = 128

初一看很诧异,仔细想想其实很合理的。

在python可能会需要同时声明多个变量,并对多个变量赋予相同的初始值,可以采用如下的方式赋值

a=b=c=1

但这里也需要注意,如果赋值为列表或者字典,比如

a=b=c=[1,2,3]

则a、b、c都是指向列表的指针,而不是复制,改变一个,其它的也会改变。

比如令 a[1] = 4, 则 b=[1,4,3]

python 赋值和拷贝 你真的了解吗?

现象:先上一段代码。

>>> import copy
>>> a = [1,2,3,4,['a','b']]
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)
>>> a.append(5)
>>> print(a)
[1, 2, 3, 4, ['a', 'b'], 5]
>>> print(b)
[1, 2, 3, 4, ['a', 'b'], 5]
>>> print(c)
[1, 2, 3, 4, ['a', 'b']]
>>> print(d)
[1, 2, 3, 4, ['a', 'b']]
>>> a[4].append('c')
>>> print(a)
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print(b)
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print(c)
[1, 2, 3, 4, ['a', 'b', 'c']]
>>> print(d)
[1, 2, 3, 4, ['a', 'b']]######内存地址########
>>> id(a)44350024>>> id(b)44350024>>> id(c)44410440>>> id(d)44410760

一、概念(原理)

1、在详细的了解python中赋值、copy和deepcopy之前

我们还是要花一点时间来了解一下python内存中变量的存储情况。

在高级语言中,变量是对内存及其地址的抽象。对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身。

python中如何对多变量连续赋值

2、赋值

在python中,对象的赋值就是简单的对象引用,这点和C++不同。如下:

list_a = [1,2,3,"hello",["python","C++"]]
list_b = list_a

这种情况下,list_b和list_a是一样的,他们指向同一片内存,list_b不过是list_a的别名,是引用。

我们可以使用 list_b is list_a 来判断,返回true,表明他们地址相同,内容相同。也可使用id(x) for x in list_a, list_b 来查看两个list的地址。

赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了新对象的引用。也就是说,除了list_b这个名字以外,没有其它的内存开销。

修改了list_a,就影响了list_b;同理,修改了list_b就影响了list_a。

3、浅拷贝

浅拷贝会创建新对象,其内容是原对象的引用。

浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数

比如对上述list_a,

切片操作:list_b = list_a[:] 或者 list_b = [each for each in list_a]

工厂函数:list_b = list(list_a)

copy函数:list_b = copy.copy(list_a)

浅拷贝产生的list_b不再是list_a了,使用is可以发现他们不是同一个对象,使用id查看,发现它们也不指向同一片内存。但是当我们使用 id(x) for x in list_a 和 id(x) for x in list_b 时,可以看到二者包含的元素的地址是相同的。

在这种情况下,list_a和list_b是不同的对象,修改list_b理论上不会影响list_a。比如list_b.append([4,5])。

但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,情况就不一样了。

list_a[4].append("C")。查看list_b,你将发现list_b也发生了变化。这是因为,你修改了嵌套的list。修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并为发生变化,指向的都是同一个位置。

4、深拷贝 

深拷贝只有一种形式,copy模块中的deepcopy函数。

和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。

同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。

python中如何对多变量连续赋值

二、关于拷贝的警告  

1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。

2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
python里对list中的整数求平均并排序
Sep 12 Python
详解Python中的__new__()方法的使用
Apr 09 Python
python机器学习实战之K均值聚类
Dec 20 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
python实现监听键盘
Apr 26 Python
Python连续赋值需要注意的一些问题
Jun 03 #Python
pytorch fine-tune 预训练的模型操作
Jun 03 #Python
Python实现byte转integer
Jun 03 #Python
Python数据分析之绘图和可视化详解
Python数据分析之pandas读取数据
Jun 02 #Python
Python 如何实现文件自动去重
python状态机transitions库详解
Jun 02 #Python
You might like
用PHP产生动态的影像图
2006/10/09 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
JavaScript null和undefined区别分析
2009/10/14 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
Python Socket使用实例
2017/12/18 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python队列queue模块详解
2018/04/27 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
python批量修改图片大小的方法
2018/07/24 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
会计出纳员的自我评价
2014/01/15 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
简历中自我评价范文
2015/03/11 职场文书
活动费用申请报告
2015/05/15 职场文书
合同补充协议书
2016/03/24 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis