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实现simhash算法实例
Apr 25 Python
python开发利器之ulipad的使用实践
Mar 16 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
用Python中的turtle模块画图两只小羊方法
Apr 09 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
通过python检测字符串的字母
Feb 18 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
如何学习Python time模块
Jun 03 Python
python中的django是做什么的
Jul 31 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
Python使用openpyxl复制整张sheet
Mar 24 Python
python区块链实现简版工作量证明
May 25 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
python实现括号匹配的思路详解
2018/08/23 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
本科毕业生求职自荐信
2014/04/09 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
七年级语文教学反思
2016/03/03 职场文书
入党申请书怎么写?
2019/06/11 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技