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 基础学习第二弹 类属性和实例属性
Aug 27 Python
vc6编写python扩展的方法分享
Jan 17 Python
python实现各进制转换的总结大全
Jun 18 Python
python利用lxml读写xml格式的文件
Aug 10 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
Django实现学员管理系统
Feb 26 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
Python安装与卸载流程详细步骤(图解)
Feb 20 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
Python configparser模块封装及构造配置文件
Aug 07 Python
python基于win32api实现键盘输入
Dec 09 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
Terran兵种介绍
2020/03/14 星际争霸
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
使用python加密自己的密码
2015/08/04 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
编程实现去掉XML的重复结点
2014/05/28 面试题
简单的JAVA编程面试题
2013/03/19 面试题
品牌推广策划方案
2014/05/28 职场文书
优秀班组申报材料
2014/12/25 职场文书
检讨书格式范文
2015/05/07 职场文书
队列队形口号
2015/12/25 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
python四种出行路线规划的实现
2021/06/23 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL