抽丝剥茧,深入剖析 Python 如何实现变量交换

深入解析AES、RSA与bcrypt:从原理到C++实现的加密算法实战 加密算法是信息安全的核心基础,它通过数学原理将明文转化为密文,确保数据的机密性、完整性与真实性。对称加密(如AES)使用相同密钥进行加解密,效率高,适合大数据量处理;非对称加密(如RSA)基于公钥与私钥配对,解决了密钥分发难题,但计算成本较高。哈希算法(如SHA-256)则生成唯一数据指纹,用于完整性校验与密码存储。在实际工程中,理解算法底层实现至关重要,例如AES的轮函数结构与密钥扩展机制直接影响其混淆与扩散特性,而RSA的欧拉定理与模逆元运算是其非对称安全性的数学基石。掌握这些原理不仅能帮助开发者避免常 阅读详情

Python 程序员肯定知道 a,b = b,a,这句话用来交换两个变量。相较于其它语言需要引入一个 temp 来临时存储变量的做法,Python 的这种写法无疑非常优雅。

简洁优雅的 C 写法:

int a = 1; 
int b = 2; 
int temp; 
temp = a; 
a = b; 
b = temp; 

简洁优雅的 Python 写法:

a,b = 1,2 
a,bb = b,a 

虽然语法非常方便,但我们始终不曾想过:它是怎么运作的?背后支撑它的机制是什么?下面让我们一步步分析它。

通俗的说法

最常见的解释是:

a,b = b,a 中右侧是元组表达式,即 b,a 是一个两个元素的 tuple(a,b)。表达式左侧是两个待分配元素,而 = 相当于元组元素拆包赋值操作。

这种方法,理解起来最简单,但实际是这种情况么?

让我们从字节码上看下,是不是这种情况。

从字节码一窥交换变量

大家可能不太了解 Python 字节码。Python 解释器是一个基于栈的虚拟机。Python 解释器就是编译、解释 Python 代码的二进制程序。

虚拟机是一种执行代码的容器,相较于二进制代码具有方便移植的特点。而 Python 的虚拟机就是栈机器。

Python 中函数调用、变量赋值等操作,最后都转换为对栈的操作。这些对栈的具体操作,就保存在字节码里。

dis 模块可以反编译字节码,使其变成人类可读的栈机器指令。如下,我们看反编译 a,b=b,a 的代码。

>>> import dis 
>>> dis.dis("a,bb=b,a") 
  1           0 LOAD_NAME                0 (b) 
              2 LOAD_NAME                1 (a) 
              4 ROT_TWO 
              6 STORE_NAME               1 (a) 
              8 STORE_NAME               0 (b) 
             10 LOAD_CONST               0 (None) 
             12 RETURN_VALUE 

可见,在 Python 虚拟机的栈上,我们按照表达式右侧的 b,a 的顺序,先后压入计算栈中,然后用一个重要指令 ROT_TWO,这个操作交换了 a 和 b 的位置,最后 STORE_NAME 操作将栈顶的两个元素先后弹出,传递给 a 和 b 元素。

栈的特性是先进后出(FILO)。当我们按b,a顺序压入栈的时候,弹出时先出的就是a,再弹出就是b。STORE_NAME指令会把栈顶元素弹出,并关联到相应变量上。

如果没有第 4 列的指令 ROT_TWO,此次 STORE_NAME 弹出的第一个变量会是后压栈的 a,这样就是 a=a 的效果。有了 ROT_TWO 则完成了变量的交换。

好了,我们知道靠压栈、弹栈和交换栈顶的两个元素,实现了 a,b = b,a 的操作。

同时,我们也知道了,上诉元组拆包赋值的说法,是不恰当的。

那 ROT_TWO 是怎么具体操作的呢?

后台怎么执行?

见名知意,可以猜出来 ROT_TWO 是交换两个栈顶变量的操作。在 Python 源代码的层面上,来看是如何交换两个栈顶的元素。

下载 Python 源代码,进入 Python/ceval.c 文件,在 1101 行,我们看到了 ROT_TWO 的操作。

TARGET(ROT_TWO){ 
 PyObject *top = TOP(); 
 PyObject *second = SECOND(); 
 SET_TOP(second); 
 SET_SECOND(top); 
 FAST_DISPATCH();  
} 

代码比较简单,我们用 TOP 和 SECOND 宏获取了栈上的 a,b 元素,然后再用 SET_TOP、SET_SECOND 宏把值写入栈中。以此完成交换栈顶元素的操作。

求值顺序的奇怪现象!

下面,我们来看一个奇怪的现象,在这篇文章里,也可以看到这个现象。如下,我们试图排序这个列表:

>>> a = [0, 1, 3, 2, 4] 
>>> a[a[2]], a[2] = a[2], a[a[2]] 
>>> a 
>>> [0, 1, 2, 3, 4] 
>>> a = [0, 1, 3, 2, 4] 
>>> a[2], a[a[2]] = a[a[2]],a[2] 
>>> a 
>>> [0, 1, 3, 3, 4] 

按照理解 a,b = b,a 和 b,a=a,b 是一样的结果,但从上例中我们看到,这两者的结果是不同的。

导致这一现象的原因在于:求值的顺序。毫无疑问,整个表达式先求右侧的两个元素,然后作为常数保存起来。最后赋值给左侧的两个变量。

最后赋值时,需要注意,我们从左到右依次赋值,如果 a[2] 先修改的话,势必会影响到其后的 a[a[2]] 的列表下标。

“你可以使用反汇编代码,来分析产生这个现象的具体步骤。”

奇怪的变回拆包现象!!

当我们使用常数作为右侧元组,来给左侧变量赋值时;或使用超过三个元素,来完成便捷交换时,其在字节码层次上便不是 ROT_TWO 这种操作了。

>>> dis.dis("a,b,c,d=b,c,d,a") 
  1           0 LOAD_NAME 
              3 LOAD_NAME 
              6 LOAD_NAME 
              9 LOAD_NAME 
             12 BUILD_TUPLE 
             15 UNPACK_SEQUENCE 
             18 STORE_NAME 
             21 STORE_NAME 
             24 STORE_NAME 
             27 STORE_NAME 
             30 LOAD_CONST 
             33 RETURN_VALUE 
>>> 

很明显,这里是在偏移 12 字节处 BUILD_TUPLE 组装元组,然后解包赋值给左侧变量。上文所述的通俗说法,在这里又成立了!

也就是说,当小于四个元素交换时,Python 采用优化的栈操作来完成交换。

当使用常量或者超过四个元素时,采用元组拆包赋值的方式来交换。

至于为什么是四个元素,应该是因为 Python 最多支持到 ROT_THREE 操作,四个元素的话,系统不知道该怎么优化了。但在新版本的 Python 中,我看到了 ROT_FOUR 操作,所以这时候,四个元素还是 ROT_* 操作来优化的。

>>>import opcode 
>>>opcode.opmap["ROT_THREE"] 
3 

此例中,该版本 Python 支持 ROT_THREE 操作,你也可以使用 ROT_FOUR 查看自己 Python 是否支持,进而确定是否可以四个以上元素便捷交换。

 

CTF逆向工程实战:从数学算法识别到漏洞利用脚本编写 逆向工程是信息安全领域的核心技术之一,涉及对软件二进制代码的分析与理解,以揭示其内部逻辑、算法或潜在漏洞。其核心原理是通过静态分析(如反汇编、反编译)与动态调试(如GDB、x64dbg)相结合,还原程序执行流程与数据变换过程。这项技术的价值在于能够深入理解软件行为、发现安全缺陷、进行恶意代码分析,并广泛应用于CTF竞赛、漏洞挖掘、软件保护与破解等场景。在CTF逆向题目中,数学算法类问题尤为常见,常涉及自定义加密、数论变换或状态机模型,要求选手从混淆代码中识别算法逻辑并编写求解脚本。本文以一道典型CTF逆向题 阅读详情

相关推荐

Castryck-Decru攻击:SIDH后量子密码学方案的结构性破解与核心教训

密钥交换协议是现代密码学的基石,其安全性依赖于特定的数学难题。后量子密码学旨在设计能够抵抗量子计算机攻击的新一代密码方案。其中,基于超奇异椭圆曲线同源的SIDH方案曾因其密钥尺寸小的优势备受关注。然而,Castryck-Decru攻击利用协议中交换的辅助点信息,通过将密钥恢复问题转化为四元数代数中带约束的理想寻找问题,并结合格基约减等算法,实现了对私钥的高效恢复。这一结构性攻击深刻揭示了密码协议设计中“额外信息”可能带来的根本性风险,为密码系统设计提供了至关重要的经验教训。

weixin_30275415的博客 356

Raptor中的常量与变量

1.常量 常量的定义:常量是在程序运行过程中固定不变且不可改变其值的量。 Raptor没有为用户定义常量的功能,只能在系统内部定义了若干符号所表示常用的数值型常量。 如: pi:圆周率,定义为3.1416 e:自然对数的底数,定义为2.7183 true/yes:布尔值真,定义为1 false/no:布尔值假,定义为0 常量的使用及展示: 2.变量 变量的定义:变量表示的是计算机内存中的位

qq_30252385的博客 1万+

(Python基础教程之九)Python中的Tuple操作

Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操作 Python中的list操作 Python中的Tuple操作 Pythonmax()和min()–在列表或数组中查找最大值和最小值 Python找到最大的N个(前N个)或最小的N个项目 Pyth...

novelly的专栏 432

raptor使用总结

编程小白,学习用raptor的简单总结: 首先,raptor的基本符号说明如下 了解这些之后,我们就可以进行流程图的绘制了,首先,在纸上画出流程图 如下 之后 又raptor绘制 得到下图

weixin_62588534的博客 7814

Navicat16/17数据库密码安全解析与实战解密指南

本文详细解析了Navicat 16/17版本中数据库密码的加密机制,并提供了实用的密码找回指南。通过导出连接文件获取加密密文,利用基于AES-128-CBC算法的本地HTML工具,可安全、离线地解密遗忘的密码。文章强调该方法仅适用于合法恢复自有密码,并给出了操作步骤与安全建议。

weixin_28835583的博客 457

PyQt5 + HFSS:给你的仿真脚本做个专属GUI界面(零基础搭建指南)

本文详细介绍了如何使用PyQt5为HFSS仿真脚本创建专属GUI界面,适合零基础用户快速上手。通过Python二次开发,实现参数可视化调整、进度实时监控等功能,大幅提升团队协作效率。文章涵盖环境配置、界面设计、HFSS集成到打包部署的全流程,是仿真工程师提升工作效率的实用指南。

weixin_42535720的博客 184

【raptor复习笔记】输出图形

raptor输出图形

qq_65140518的博客 8788

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

liang007dudu的博客 1万+

抽丝剥茧,深入剖析 Python 如何实现变量交换!

Python 程序员肯定知道 a,b = b,a,这句话用来交换两个变量。相较于其它语言需要引入一个 temp 来临时存储变量的做法,Python 的这种写法无疑非常优雅。佶屈聱牙的 C ...

小詹学python的博客 206

Unity 机械臂控制(二)——从碰撞检测到姿态解算:实现精准抓取

本文详细介绍了Unity中机械臂控制的实现方法,从碰撞检测到姿态解算,涵盖精准抓取的全流程。重点讲解了碰撞检测的分层处理、状态机设计、逆向运动学(IK)算法以及抓取稳定性优化等关键技术,并提供了实用的调试技巧和性能优化建议,帮助开发者实现高效的机械臂控制。

weixin_28693447的博客 304

从 0 搭建一个智能问答工单系统:低代码 + 大模型的实战融合方案

企业智能问答工单系统解决方案:通过橙武低代码平台集成DeepSeek大模型,实现自动化工单处理与智能问答。系统能自动匹配知识库、分类工单,支持多渠道接入,显著提升响应效率(答复时间从12小时降至5分钟)。采用MySQL8表结构设计,结合向量数据库实现语义搜索,客服人力需求减少70%。系统支持知识库持续优化,AI答复满意度达88%,助力企业低成本构建智能客服中台。

欢迎来到我的优快云博客!我专注于技术创新和数字化转型,特别是在低代码平台、人工智能和大数据分析领域的探索与应用。通过深入分析各种行业案例,帮助企业加速数字化进程,提升运营效率与创新能力。在这里,您将找到关于低代码平台、AI技术、数据分析与 1548

从SessionKey参数漏洞剖析任意用户登录攻击原理与防御

身份认证是Web应用安全的核心基础,其原理在于验证用户身份并建立可信会话。在Session-Cookie等传统机制中,会话凭证的生成与管理直接关系到系统安全。若凭证设计存在缺陷,如熵源不足、缺乏状态绑定,攻击者可能绕过密码验证,直接实现任意用户登录,危害等级极高。本文通过一个实战案例,深入剖析了因自定义sessionKey参数引发的身份认证绕过漏洞。该漏洞源于一个用于兼容老客户端的“凭据交换”机制,其sessionKey仅由用户ID与时间戳简单加密生成,且服务端未进行有效期与状态校验,导致攻击者可通过枚举时

weixin_34152820的博客 402

连接参数详解:Connection Interval, Slave Latency, Supervision Timeout 的协同与调优实战

在低功耗蓝牙(BLE)开发与调试中,Connection Interval(连接间隔)、Slave Latency(从机延迟) 和 Supervision Timeout(监督超时) 是三个核心参数。它们不仅直接影响设备的通信性能、功耗表现和连接稳定性,更是各类技术面试与认证考试的高频考点。本文将从基础概念出发,深入剖析三者的协同机制,结合历年真题解析考点与解题思路,并通过实战案例演示调优方法,快速掌握这一核心知识点。

byte轻骑兵的技术小窝 2761

文件包含漏洞实战:从CTF赛题看PHP特性与LFI2RCE利用链

文件包含漏洞是Web安全中的经典漏洞类型,其核心原理在于程序未对用户可控的文件路径进行严格校验,导致恶意文件被包含执行。在PHP环境中,include、require等函数的不当使用是主要成因。该漏洞的技术价值在于可能实现本地文件读取甚至远程代码执行,常被用于权限提升和信息窃取。典型的应用场景包括CMS插件包含、配置文件读取等。本文以一道CTF赛题为案例,深入探讨了如何通过PHP临时文件机制和日志污染技术,在存在路径穿越符过滤和协议限制的情况下,实现从本地文件包含到远程代码执行的完整利用链,其中涉及PHP文

weixin_30681615的博客 358

【专栏导引贴】100+智能优化算法:从背景原理到代码实战(持续更新)

本专栏系统整理100+种现代优化算法,涵盖粒子群优化(PSO)、遗传算法(GA)、鲸鱼优化(WOA)等经典方法,以及白鲸优化(BWO)、非洲秃鹫优化(AVOA)等新兴算法。每篇详解包含生物启发原理、数学模型、代码实现及工程应用,采用统一编程风格,提供可直接运行的实例代码。专栏持续更新,旨在为研究者提供系统化的智能优化算法参考资料,实现从理论到实践的完整知识链。目前已收录23种算法,包括蚁群系统(ACS)、蝙蝠算法(BA)、天牛须搜索(BAS)等自然启发式优化方法。

qq_42212808的博客 3642

详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署

YOLO(You Only Look Once)系列算法因其高效、准确等特点而备受瞩目。由2023年Ultralytics公司发布了YOLO的最新版本YOLOv8是结合前几代YOLO的基础上的一个融合改进版。本文YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署,从网络结构的讲解从模型的网络结构讲解到模型的部署都有详细介绍,同时在本专栏中还包括YOLOv8模型系列的改进包括个人提出的创新点,传统卷积、注意力机制、损失函数的修改教程,能够帮助你的论文获得创新点。

Snu77的博客 8万+

地球Online逃生指南(上卷)

本书是一部系统探讨人类意识困境的哲学著作。全书通过七卷本的结构,依次解构人类认知牢笼、自我本质、世界实相、痛苦根源,最终指向自由、慈悲与终极实相。第一卷揭示大脑建构的认知幻象;第二卷剖析"自我"的神经机制;第三卷以系统论阐释世界空性;第四卷建立痛苦的数学模型;第五卷提出觉知训练体系;第六卷论证利他主义的科学基础;第七卷超越逻辑束缚直指存在本质。著作融合现代神经科学、量子物理、复杂性理论与东方哲学,构建了一个从认识到解脱的完整认知框架,最终指向无条件的临在与宇宙层面的觉知。

weixin_45747731的博客 829

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

三种方法交换两个变量的值

三种方法交换两个变量的值 文章目录三种方法交换两个变量的值1. 加减法2. 异或法3. 交换变量法 1. 加减法 #include <stdio.h> int main() { int a = 3; int b = 5; a = a + b; b = a - b; a = a - b; printf("%d,%d\n",a,b)...

一叶知秋的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机rapter 流程图,Raptor设计程序流程图并运行的具体操作步骤

想知道Raptor怎么设计程序流程图吗?以下就是Raptor设计程序流程图并运行的具体操作步骤,赶紧来看看吧,希望能帮助到大家哦!Raptor设计程序流程图并运行的具体操作步骤1、Raptor程序比较小,把下载好的Raptor安装程序。安装在计算机中,鼠标左键双击,运行程序,如下图所示。2、在运行的Raptor界面上,单击【保存】按钮,并准备流程图设计。接着,在运行的Raptor界面上,单击【保存...

weixin_32218639的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

交换两个变量a,b的值

#include <stdio.h> int main() { int a=2, b=3; a = a - b; b = a + b; a = b - a; printf("%d,%d", a, b); return 0; }

s3088784247的博客 1763

python交换两个值原理_python如何交换两个变量的值

python如何交换两个变量的值?工具/原料python方法/步骤1很多编程语言中,两个变量进行值交换,都必须借助第三个变量来实现,如下图所示中的dos脚本,交换变量x,y的值,需要利用到第三个变量Z。2在python中,就必须简单了,下面我们一步步来进行操作演示。首先给x,y变量赋值:x=10y=203python中,还可以几个变量一起幅值,如x,y=10,204python中,两个变量交换值可...

weixin_39576751的博客 2136

基本的位运算

一、与运算(&) 位运算常被用于二进制的运算,例如利用子网掩码计算ip地址,把挡住的字段作为网段,其余的作为ip地址 与运算的结果如下,两边同时为1,则结果为1 0&0=0,0&1=0,1&0=0,1&1=1 二、非运算(~) 非运算即取反运算,在二进制中1变0,0变1110101进行非运算后为001010即1010 三、或运算...

weixin_30896825的博客 229

3种交换变量值的方法

//中间变量法 void swap1(int& a,int& b) { int temp=a; a=b; b=temp; } //相互加减法 void swap2(int& a,int& b) { a=a+b;//可能会溢出 b=a-b; a=a-b; } //异或法 void swap3(int& a,int& b) { a^=b;

Rover1234的专栏 690
上一篇: Selenium2+python自动化65-js定位几种方法总结
下一篇: 六个实例,八段代码,详解Python中的for循环
Python_xiaowu
博客等级 码龄5年 3096粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值