首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >' is‘关键字在Python中是如何实现的?

' is‘关键字在Python中是如何实现的?
EN

Stack Overflow用户
提问于 2010-06-07 16:17:55
回答 8查看 42.8K关注 0票数 68

..。可用于字符串相等的is关键字。

代码语言:javascript
复制
>>> s = 'str'
>>> s is 'str'
True
>>> s is 'st'
False

我尝试了__is__()__eq__(),但它们都不起作用。

代码语言:javascript
复制
>>> class MyString:
...   def __init__(self):
...     self.s = 'string'
...   def __is__(self, s):
...     return self.s == s
...
>>>
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work
False
>>>
>>> class MyString:
...   def __init__(self):
...     self.s = 'string'
...   def __eq__(self, s):
...     return self.s == s
...
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work, but again failed
False
>>>
EN

回答 8

Stack Overflow用户

发布于 2010-06-07 16:27:04

is运算符等同于比较id(x)值。例如:

代码语言:javascript
复制
>>> s1 = 'str'
>>> s2 = 'str'
>>> s1 is s2
True
>>> id(s1)
4564468760
>>> id(s2)
4564468760
>>> id(s1) == id(s2)  # equivalent to `s1 is s2`
True

id目前被实现为使用指针作为比较。所以你不能重载is本身,AFAIK你也不能重载id

所以,你不能。在python中很少见,但它就是这样。

票数 24
EN

Stack Overflow用户

发布于 2010-06-07 16:27:42

Python is关键字测试对象标识。您不应该使用它来测试字符串是否相等。它似乎经常工作,因为Python实现像许多非常高级的语言一样,执行字符串的“插入”。也就是说,字符串、文字和值在内部保存在一个散列列表中,而那些完全相同的字符串和值则呈现为对同一对象的引用。(这是可能的,因为Python字符串是不可变的)。

但是,与任何实现细节一样,您不应该依赖这一点。如果您想测试相等性,请使用==运算符。如果您真的想测试对象标识,那么使用is -我很难想到您应该关心字符串对象标识的情况。不幸的是,你不能指望两个字符串是不是在某种程度上是“故意”相同的对象引用,因为前面提到的interning。

票数 16
EN

Stack Overflow用户

发布于 2010-06-07 16:26:22

is关键字用于比较对象(或者,如果两个引用指向同一对象,则进行比较)。

我想,这就是为什么没有机制来提供你自己的实现。

它有时碰巧在字符串上工作,因为Python“巧妙地”存储字符串,这样当您创建两个相同的字符串时,它们被存储在一个对象中。

代码语言:javascript
复制
>>> a = "string"
>>> b = "string"
>>> a is b
True
>>> c = "str"+"ing"
>>> a is c
True

您可以在一个简单的“复制”示例中看到参考与数据比较:

代码语言:javascript
复制
>>> a = {"a":1}
>>> b = a
>>> c = a.copy()
>>> a is b
True
>>> a is c
False
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2987958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档