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利用正则表达式提取字符串
Dec 08 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
神经网络理论基础及Python实现详解
Dec 15 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
详解python中eval函数的作用
Oct 22 Python
python通过matplotlib生成复合饼图
Feb 06 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
python根据字典的键来删除元素的方法
Aug 16 Python
Python基于Faker假数据构造库
Nov 30 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实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php实现的顺序线性表示例
2019/05/04 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
JavaScript 继承使用分析
2011/05/12 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
js闭包的用途详解
2014/11/09 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
原生js实现轮播图
2017/02/27 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
跟老齐学Python之集合(set)
2014/09/24 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python实现DDos攻击实例详解
2019/02/02 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
物理教师自荐信范文
2013/12/28 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
安徽导游词
2015/02/12 职场文书
诚信高考倡议书
2019/06/24 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
如何通过一篇文章了解Python中的生成器
2022/04/02 Python