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获取当前日期和时间的方法
Apr 30 Python
python对html代码进行escape编码的方法
May 04 Python
Python的Django框架下管理站点的基本方法
Jul 17 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
Python获取网段内ping通IP的方法
Jan 31 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 Python
利用python做表格数据处理
Apr 13 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 404错误页面实现代码
2009/06/22 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
Python3导入自定义模块的三种方法详解
2018/04/13 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
美国知名生活购物网站:Goop
2017/11/03 全球购物
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
大学教师年终总结的自我评价
2013/10/29 职场文书
银行职员自我鉴定
2014/04/20 职场文书
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书