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实现调用其他python脚本的方法
Oct 05 Python
python多线程用法实例详解
Jan 15 Python
介绍Python中的文档测试模块
Apr 28 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
Python 中判断列表是否为空的方法
Nov 24 Python
Python递归实现打印多重列表代码
Feb 27 Python
Python 实现自动完成A4标签排版打印功能
Apr 09 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
Python json解析库jsonpath原理及使用示例
Nov 25 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 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
Zend引擎的发展 [15]
2006/10/09 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
js实现放大镜特效
2017/05/18 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
python中定义结构体的方法
2013/03/04 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
Python 功能和特点(新手必学)
2015/12/30 Python
python文件的md5加密方法
2016/04/06 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
django主动抛出403异常的方法详解
2019/01/04 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
工作失误检讨书范文大全
2014/01/13 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
班干部演讲稿
2014/04/24 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
2014年网管工作总结
2014/12/11 职场文书
三下乡活动心得体会
2016/01/23 职场文书
基于python实现银行管理系统
2021/04/20 Python
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android