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 json encode datetime类型
Dec 28 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
对python sklearn one-hot编码详解
Jul 10 Python
python实现身份证实名认证的方法实例
Nov 08 Python
在Python中使用MongoEngine操作数据库教程实例
Dec 03 Python
利用python画出AUC曲线的实例
Feb 28 Python
Python API len函数操作过程解析
Mar 05 Python
Python如何实现FTP功能
May 28 Python
pycharm sciview的图片另存为操作
Jun 01 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 Python
Python-OpenCV实现图像缺陷检测的实例
Jun 11 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内存缓存Memcached类实例
2014/12/08 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
javascript引导程序
2008/10/26 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python求解平方根的方法
2015/03/11 Python
Python网站验证码识别
2016/01/25 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
深入了解python中元类的相关知识
2019/08/29 Python
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
森林防火标语
2014/06/23 职场文书
审计班子对照检查材料
2014/08/27 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
领导干部考核评语
2015/01/04 职场文书
单位实习介绍信
2015/05/05 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL