python 实现两个变量值进行交换的n种操作


Posted in Python onJune 02, 2021

python 两个变量值交换

方法一:

c = 0
c= a
a= b
b= c

方法二:

a,b = b,a

这是python的基本方法

方法三:(只用两个变量实现)

a = a+b
b = a-b
a = a-b

python两个数值互换(浅析a,b=b,a原理)

python交换两个值得方法非常简单,即a,b=b,a,一步操作就交换了两个值,那么这是为什么呢?

真相:

Python的变量并不直接存储值,而只是引用一个内存地址,交换变量时,只是交换了引用的地址。

先看下面这段程序:

import dis

def func(a,b):
    a,b=b,a
    print(a,b)
    
a=10
b=20
func(a,b)
dis.dis(func)

一般来说一个Python语句会对应若干字节码指令,Python的字节码是一种类似汇编指令的中间语言,但是一个字节码指令并不是对应一个机器指 令(二进制指令),而是对应一段C代码,而不同的指令的性能不同,所以不能单独通过指令数量来判断代码的性能,而是要通过查看调用比较频繁的指令的代码来 确认一段程序的性能。

一个Python的程序会有若干代码块组成,例如一个Python文件会是一个代码块,一个类,一个函数都是一个代码块,一个代码块会对应一个运行的上下文环境以及一系列的字节码指令。

dis的作用   

dis模块主要是用来分析字节码的一个内置模块,经常会用到的方法是dis.dis([bytesource]),参数为一个代码块,可以得到这个代码块对应的字节码指令序列。

代码输出结果

python 实现两个变量值进行交换的n种操作

其中只看前面为12的结果就行了(在我的编译器里,交换的那一行代码在第12行)

可以看出主要是ROT_TWO指令的功劳:

查阅python文档可以知道有ROT_TWO (源码1398行),ROT_THREE(源码1406行), ROT_FOUR这样的指令,可以直接

交换两个变量、三个变量、四个变量的值

在python3.4的源码中查阅ceval.c文件可以看到:

TARGET(ROT_TWO) {           
    PyObject *top = TOP();          
    PyObject *second = SECOND();       
    SET_TOP(second);          
    SET_SECOND(top);         
    FAST_DISPATCH();       
}        
TARGET(ROT_THREE) {            
	PyObject *top = TOP();            
	PyObject *third = THIRD();            
	SET_SECOND(third);            
	FAST_DISPATCH();        
}

附:python值的交换

变量的每一次初始化,都开辟了一个新的空间,将新内容的地址赋值给变量。对于下图来说,我们重复的给str1赋值,其实在内存中的变化如图:

python 实现两个变量值进行交换的n种操作

从上图我们可以看出,str1在重复的初始化过程中,是因为str1中存储的元素地址由'hello world'的地址变成了'new hello world'的。

对于复杂的数据类型来说,改变其内部的值对于变量的影响:

python 实现两个变量值进行交换的n种操作

python 实现两个变量值进行交换的n种操作

当对列表中的元素进行一些增删改的操作的时候,是不会影响到lst1列表本身对于整个列表地址的,只会改变其内部元素的地址引用。

可是当我们对于一个列表重新初始化(赋值)的时候,就给lst1这个变量重新赋予了一个地址,覆盖了原本列表的地址,这个时候,lst1列表的内存id就发生了改变。上面这个道理用在所有复杂的数据类型中都是一样的。

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

Python 相关文章推荐
Python中的迭代器与生成器高级用法解析
Jun 28 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
git进行版本控制心得详谈
Dec 10 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
python 叠加等边三角形的绘制的实现
Aug 14 Python
Django自关联实现多级联动查询实例
May 19 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
python爬虫中的url下载器用法详解
Nov 30 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
Python数据可视化之绘制柱状图和条形图
May 25 Python
分析Python list操作为什么会错误
Nov 17 Python
聊聊Python中关于a=[[]]*3的反思
python内置进制转换函数的操作
Jun 02 #Python
Python 内置函数速查表一览
Jun 02 #Python
利用Python判断你的密码难度等级
Jun 02 #Python
Python标准库之typing的用法(类型标注)
只用50行Python代码爬取网络美女高清图片
这样写python注释让代码更加的优雅
Jun 02 #Python
You might like
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
Javascript倒计时代码
2010/08/12 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
使用nodejs中httpProxy代理时候出现404异常的解决方法
2016/08/15 NodeJs
JS获取鼠标相对位置的方法
2016/09/20 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
ionic3 懒加载
2017/08/16 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python import用法以及与from...import的区别
2015/05/28 Python
谈谈python中GUI的选择
2018/03/01 Python
python实现图片文件批量重命名
2020/03/23 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
mac使用python识别图形验证码功能
2020/01/10 Python
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
索赔员岗位职责
2015/02/15 职场文书
圆明园观后感
2015/06/03 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
浅谈怎么给Python添加类型标注
2021/06/08 Python
一文带你探究MySQL中的NULL
2021/11/11 MySQL
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python