前两天,python交流群里有人问:

“x”<"y"==True

这个表达式输出的是什么,脑子都没动,就觉得应该是True

居然被否定了!立马在命令行里敲了一下,准备用事实打对方脸。

But,是我的脸被打了,命令行给了我一个大大的False!!

这。。。。。。。。。。。。。。

'x'<'y'==True不就是('x'<'y')==True么??我哪里错了!

都不知道怎么去网上查去了!

幸亏最近学了一个新模块,dis

立马拿来强行装b.upper()

dis模块可以把python内容,转成字节码,也就是能看具体的底层动作

import dis
dis.dis("'x'<'y'==True") dis.dis("('x'<'y')==True")

1.先来看下('x'<'y')==True"的dis反编译

1)加载x到栈,

2)加载y到栈,

3)进行比较操作

4)加载True到栈

5)进行比较操作

6)返回比较结果

感觉就应该是这样子么!

2.再来看看'x'<'y'==True的反编译

就是框起来的这两个段造的孽

1)加载x到栈

2)加载y到栈

3)DUP_TOP,这是什么神仙操作?

  查了一下手册:Duplicates the reference on top of the stack.复制堆栈顶部的引用。

  所以,此时栈内数据是x|y|y(左边是栈底;栈底是x,栈顶是刚刚复制的那个y)

4)ROT_THREE 把栈内第二和第三位置的值,向栈顶推一个位置,原栈顶移到第三的位置

  也就是此时栈内数据是y|x|y(左边是栈底;栈底是之前复制的那个y,栈顶是2)压入的y)

5)栈顶的x和y进行比较操作

6)跳转判断

7)加载True

8)栈顶的两个值进行‘==‘判断,也就是‘y’和True

  这怎么可能相等?!!!

也就是说,python里边的‘x’<'y'==True 等价于 'x'<'y' and 'y'==True

好吧~~~~~~~

记python 链式比较的坑的更多相关文章

  1. Python 笔试集(1):关于 Python 链式赋值的坑

    前言 Python 的链式赋值是一种简易型批量赋值语句,一行代码即可为多个变量同时进行赋值. 例如: x = y = z = 1 链式赋值是一种非常优雅的赋值方式,简单.高效且实用.但同时它也是一个危 ...

  2. Python链式赋值执行顺序及执行方式的证明

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<关于Python链式赋值的赋值顺序问题& ...

  3. [Python]解决python链式extend的技巧

    众所周知python中的list是可以extend的,功能 旨在将两个list合并成一个.譬如[1,2,3].extend([4,5,6])=[1,2,3,4,5,6] 假如有一个list的list, ...

  4. python链式对比

    参考 https://www.cnblogs.com/shanghongyun/p/10519579.html 为什么Python中“2==2>1”结果为True在Python中,你可能会发现这 ...

  5. 由反转链表想到python链式交换变量

    这两天在刷题,看到链表的反转,在翻解体思路时看到有位同学写出循环中一句搞定三个变量的交换时觉得挺6的,一般用的时候都是两个变量交换(a,b=b,a),这种三个变量的交换还真不敢随便用,而且这三个变量都 ...

  6. 关于Python链式赋值的赋值顺序问题

    在<第4.7节 Python特色的序列解包.链式赋值.链式比较>一文中,老猿这样介绍的: 链式赋值是用一行语句将多个变量赋值为同一个值,语法如下: 变量1=变量2=变量n=赋值表达式 该语 ...

  7. thinkphp5.1中使用链式操作的坑

    1.在进行tp5->tp5.1的时候,没有想太多,直接使用之前的代码:结果在该操作中,多次调用该get方法,tp5.1的链式操作一直保持了之前的搜索条件,截图如下:(具体的代码没有展示) 2.然 ...

  8. python链式调用REST API把参数放到URL中

    需求格式:GET /users/:user/repos 程序: class Chain(object): def __init__(self,path=''): self._path=path def ...

  9. Javascript、C#、php、asp、python 等语言的链式操作的实现

    一.什么是链式操作 把需要的下一步操作的对象通过上一步操作返回回来.使完成某些功能具有持续性. 二.链式操作优点 代码更精简优雅.链式操作能大大精简代码量,多项操作一行代码一气呵成,搞定: 链式操作应 ...

随机推荐

  1. linux使用php动态安装模块mysqli.so(ext/mysqlnd/mysqlnd.h: 没有那个文件或目录)

    由于我先安装的php,再安装的mysql! 正常过程: 1.安装mysql 2.安装php configure时带–with-mysql参数 现在我不想重装,因此使用phpize动态安装mysqli, ...

  2. 从零搭建Spring Cloud Gateway网关(一)

    新建Spring Boot项目 怎么新建Spring Boot项目这里不再具体赘述,不会的可以翻看下之前的博客或者直接百度.这里直接贴出对应的pom文件. pom依赖如下: <?xml vers ...

  3. Session的常用方法

    Session的常用方法 session对象主要用于属性操作和会话管理,常用方法如下: 1.public void setAttribute(String name,String value)设定指定 ...

  4. Mysql - 删除表时出现: Cannot delete or update a parent row: a foreign key constraint fails

    现象 MySQL在删除一张表时出现 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint ...

  5. python通过scapy编写arp扫描器

    多网卡的情况下发送二层包需要配置网卡 三层包不需要配置接口发包方法: sr() 发送三层数据包,等待接收一个或者多个数据包的响应 sr1() 发送三层数据包,只会接收一个数据包的响应 srp() 发送 ...

  6. 扯一扯基于4046系IC的锁相电路设计

             4046系IC(下简称4046),包括最常见的CD4046(HEF4046),可以工作在更高频的74(V)HC4046,以及冷门而且巨难买到的74HC(T)7046和74HCT904 ...

  7. JS三个事件绑定方法

    1. JS三个事件绑定方法 1.1. 使用html进行事件绑定 1.直接在html标签上写入事件类型和事件处理方法. <button onclick = "alert('hello w ...

  8. 深入Redis命令的执行过程

    深入Redis命令的执行过程 Redis 服务器: Redis 服务器实现与多个客户端的连接,并处理这些客户端发送过来的请求,同时保存客户端执行命令所产生的数据到数据库中.Redis 服务器依靠资源管 ...

  9. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

  10. Hive面试准备

    Hive与HBase的区别Hive架构原理Hive的数据模型及各模块的应用场景Hive支持的文件格式和压缩格式及各自特点Hive内外表的区分方法及内外部差异Hive视图如何创建.特点及应用场景Hive ...