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中的tuple元组详细介绍
Feb 02 Python
Python多线程编程(一):threading模块综述
Apr 05 Python
简单谈谈python中的Queue与多进程
Aug 25 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
Python 字典中的所有方法及用法
Jun 10 Python
基于python实现模拟数据结构模型
Jun 12 Python
python中执行smtplib失败的处理方法
Jul 01 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
python matlab库简单用法讲解
Dec 31 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中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
PHP 裁剪图片
2021/03/09 PHP
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
js select常用操作控制代码
2010/03/16 Javascript
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
Python Mysql自动备份脚本
2008/07/14 Python
Python实现的数据结构与算法之队列详解
2015/04/22 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Django中间件实现拦截器的方法
2018/06/01 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
少先队学雷锋活动月总结
2014/03/09 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
安全生产年活动总结
2014/08/29 职场文书
对照检查剖析材料
2014/09/30 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
信用卡催款律师函
2015/05/27 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书