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 yield 使用浅析
May 28 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
mac下如何将python2.7改为python3
Jul 13 Python
django_orm查询性能优化方法
Aug 20 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
简单了解python高阶函数map/reduce
Jun 28 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
Mar 13 Python
Python 实现简单的客户端认证
Jul 29 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
PHP连接access数据库
2008/03/27 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
快速排序 php与javascript的不同之处
2011/02/22 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
Python用GET方法上传文件
2015/03/10 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Python操作MySQL数据库的方法
2018/06/20 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
python3 拼接字符串的7种方法
2018/09/12 Python
pycharm导入源码的具体步骤
2020/08/04 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
python 深度学习中的4种激活函数
2020/09/18 Python
python cookie反爬处理的实现
2020/11/01 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
购买大码女装:Lane Bryant
2016/09/07 全球购物
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
导游个人求职信范文
2014/03/23 职场文书
语文教师求职信范文
2015/03/20 职场文书
我是特种兵观后感
2015/06/11 职场文书
主婚人致辞精选
2015/07/28 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL