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赋值操作方法分享
Mar 23 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
TensorFlow模型保存和提取的方法
Mar 08 Python
linux查找当前python解释器的位置方法
Feb 20 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
超实用的 30 段 Python 案例
Oct 10 Python
Flask缓存静态文件的具体方法
Aug 02 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 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数组操作简单案例分析
2016/10/15 PHP
javascript 避免闭包引发的问题
2009/03/17 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
python实现读取并显示图片的两种方法
2017/01/13 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python try except 捕获所有异常的实例
2018/10/18 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
如何使用Python调整图像大小
2020/09/26 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
复古服装:RetroStage
2019/05/10 全球购物
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
医学院校毕业生自荐信范文
2014/01/01 职场文书
活动策划邀请函
2014/02/06 职场文书
运动会通讯稿500字
2014/02/20 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
西湖英语导游词
2015/02/06 职场文书
期末个人总结范文
2015/02/13 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
中学教代会开幕词
2016/03/04 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis