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中类的一些方法分析
Sep 25 Python
python定时检查某个进程是否已经关闭的方法
May 20 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
python3实现高效的端口扫描
Aug 31 Python
django queryset相加和筛选教程
May 18 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
如何用Python徒手写线性回归
Jan 25 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
Python实现日志实时监测的示例详解
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显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
php数组转成json格式的方法
2015/03/09 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
javascript加号"+"的二义性说明
2013/03/04 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
JavaScript mixin实现多继承的方法详解
2017/03/30 Javascript
Python去除字符串两端空格的方法
2015/05/21 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python安装selenium包详细过程
2019/07/23 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
C#面试常见问题
2013/02/25 面试题
公司请假条格式
2014/04/11 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
经销商年会策划方案
2014/05/29 职场文书
政协常委会议主持词
2015/07/03 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript