Python 奇谈

Python 奇谈

请看下面代码

def check(x):
    if 1+x is x+1:
        return False
    if 2+x is not x+2:
        return False
    return True

让我们想想看,当参数是什么的时候,check函数会返回 True ??

分析:

  1. 要让check函数返回 True 那就意味着程序执行时必须跳过前面两个 if 语句块,即两个if判断语句均为 False ;
  2. is 语句用于判断其左右两边是否为同一实例对象,若是同一实例对象返回 True, 否则返回 False
  3. 通过1,2知道,满足条件的参数 x 应该满足下面两个条件:

(1) 1 + xx + 1 不是同一实例对象;
(2) 然而, 2 + xx + 2 是同一实例对象;

那到底什么数可以满足上面分析条件,并返回 True 呢?
让我们暴力破解一番,即输入不同的整数调用 check 函数直到返回 True。
结果就是,只有当带入-7时,函数返回了 True 。

原因剖析:

python 中一切皆是对象,随意一个整数就是 int 类的一个实例对象。
为了程序运行效率, python 会在程序运行前创建 -5 ~ 256 的整数对象供用户使用,且这些对象都是单例,即在此范围内的一个数字只会对应一个实例对象。\

>>> x = -7
>>> print((1+x) is (x+1)) # -6不是单例
output: False
>>> print((2+x) is (x+2)) # -5 是单例
output: True

其他情况

还有一种方法可以让 check 函数返回True; 看下面代码

# 创建一个继承自 int 的 Test 类
class Test(int):
    def __add__(self, v):
        if v == 1:
            return 0 # 只要不是1就行
        else:
            return v

>>> t = Test() # 创建 Test 实例对象t 
>>> print(t) # 打印 t ,输出 0
output: 0
>>> print((1+x) is (x+1)) #根据__add__方法知道 x + 1 的值为 0
# 由于没有定义__radd__方法,所以1 + x 的值为1
output: False
>>> print((2+x) is (x+2))
# 根据__add__方法,x + 2 的值应该是2(x加任何非1的数得到的都是该数本身)
# 2 + x 即 2 + 0 得到2,由于2 为单例所以比较的结果为True
output: True

参考:挑战你,Python 益智题:如何让这个函数返回 True

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值