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实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
用C++封装MySQL的API的教程
May 06 Python
Python实现的彩票机选器实例
Jun 17 Python
改进Django中的表单的简单方法
Jul 17 Python
python3编码问题汇总
Sep 06 Python
Python模拟随机游走图形效果示例
Feb 06 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
django fernet fields字段加密实践详解
Aug 12 Python
python爬虫之遍历单个域名
Nov 20 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
Python Matplotlib简易教程(小白教程)
Jul 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
JSON 学习之完全手册 图文
2007/05/29 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
JS中递归函数
2016/06/17 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
node.js的Express服务器基本使用教程
2019/01/09 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
学校光盘行动倡议书
2015/04/28 职场文书
珍爱生命主题班会
2015/08/13 职场文书
小组组名及励志口号
2015/12/24 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python