python is_理解Python的“is”操作符

54584d7d00012c0f02200220-100-100.jpg

慕函数4003404

另一份副本问为什么两个相等的字符串通常是不完全相同的,这一点在这里并没有得到真正的回答:>>> x = 'a' >>> x += 'bc'>>> y = 'abc'>>> x == yTrue>>> x is yFalse那他们为什么不是同一根绳子?特别是考虑到这一点:>>> z = 'abc'>>> w = 'abc'>>> z is wTrue让我们把第二部分推迟一会儿。第一个怎么可能是真的?解释器必须有一个“interning表”,这是一个将字符串值映射到String对象的表,所以每次尝试创建一个包含内容的新字符串时,都必须使用'abc',你会得到同样的东西。维基百科有一个更详细的讨论如何实习工作。和Python有字符串实习生表;您可以使用sys.intern方法。事实上,Python是允许自动实习生任何不可变类型,但不能所需这样做。不同的实现将产生不同的值。CPython(如果您不知道使用的是哪个实现,则使用的实现)、自动实习生、小整数和一些特殊的单子,如False,但不包括字符串(或大整数、小元组或其他任何东西)。你可以很容易地看到这一点:>>> a = 0>>> a += 1>>> b = 1>>> a is bTrue>>> a = False>>> a = not a>>> b = Truea is bTrue>>> a = 1000>>> a += 1>>> b = 1001>>> a is bFalse好吧,但为什么z和w完全一样?这不是解释器自动实习生,而是编译器折叠值。如果同一个编译时字符串在同一个模块中出现两次(这意味着很难定义-这与字符串文本不一样,因为r'abc', 'abc',和'a' 'b' 'c'都是不同的文字,但字符串是相同的,但很容易直观地理解),编译器将只创建一个字符串实例,其中包含两个引用。实际上,编译器甚至可以更进一步:'ab' + 'c'可以转换为'abc'通过优化器,在这种情况下,它可以与'abc'常量在同一个模块中。同样,Python是允许的,但不需要这样做。但是在这种情况下,CPython总是折叠小字符串(例如,小元组)。(尽管交互式解释器的语句逐语句编译器没有运行与实时模块编译器相同的优化,所以您不会在交互中看到完全相同的结果。)那么,作为一个程序员,你应该做些什么呢?井…没什么。您几乎没有理由关心两个不变的值是否相同。如果你想知道什么时候你可以用a is b而不是a == b你问错问题了。只是总是用a == b除两种情况外:要获得更多可读性与单例值的比较,请参见x is None.对于可变值,当您需要知道是否发生变异时x将影响y.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值