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写的图片蜘蛛人代码
Aug 27 Python
Python利用ansible分发处理任务
Aug 04 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
Python中类的初始化特殊方法
Dec 01 Python
Python内建模块struct实例详解
Feb 02 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
python基于event实现线程间通信控制
Jan 13 Python
如何在python中实现线性回归
Aug 10 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 表单提交给自己
2008/07/24 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
JavaScript switch语句使用方法简介
2019/12/30 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
python3.4实现邮件发送功能
2018/05/28 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
车间核算员岗位职责
2014/07/01 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
AJAX学习笔记
2021/05/18 Javascript
python实现简单聊天功能
2021/07/07 Python