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实现telnet客户端的方法
Apr 15 Python
简单介绍Python中的JSON使用
Apr 28 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
python 内置函数汇总详解
Sep 16 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
简单了解Pandas缺失值处理方法
Nov 16 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
Python configparser模块配置文件过程解析
Mar 03 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 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编程网上资源导航
2006/10/09 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
Javascript缓存API
2016/06/14 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
Python socket编程实例详解
2015/05/27 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
python datetime中strptime用法详解
2019/08/29 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
知识竞赛活动方案
2014/02/18 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
2015年元旦活动总结
2014/05/09 职场文书
2015年手术室工作总结
2015/05/11 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书