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采用getopt解析命令行输入参数实例
Sep 30 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
Python序列操作之进阶篇
Dec 08 Python
python中返回矩阵的行列方法
Apr 04 Python
Python访问MongoDB,并且转换成Dataframe的方法
Oct 15 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
python实现淘宝购物系统
Oct 25 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
10个顶级Python实用库推荐
Mar 04 Python
深度学习tensorflow基础mnist
Apr 14 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
MySQL 日期时间函数常用总结
2012/06/12 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
js函数排序的实例代码
2013/07/01 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
Python selenium的基本使用方法分析
2019/12/21 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
python 追踪except信息方式
2020/04/25 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
违反校纪校规检讨书
2014/02/15 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
观看信仰心得体会
2014/09/04 职场文书
活动新闻稿范文
2015/07/17 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python