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 17 Python
Python实现字典去除重复的方法示例
Jul 31 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
如何通过python的fabric包完成代码上传部署
Jul 29 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
python 使用建议与技巧分享(四)
Aug 18 Python
教你如何用python操作摄像头以及对视频流的处理
Oct 12 Python
python Polars库的使用简介
Apr 21 Python
Python中的datetime包与time包包和模块详情
Feb 28 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 定界符 使用技巧
2009/06/14 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
python机器学习实战之K均值聚类
2017/12/20 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python 拼接文件路径的方法
2018/10/23 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
python实现简单遗传算法
2020/09/18 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
我的求职计划书
2014/01/10 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
个人委托书格式
2014/04/04 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
六一儿童节开幕词
2015/01/29 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
分享7个 Python 实战项目练习
2022/03/03 Python
Django框架中视图的用法
2022/06/10 Python