..。可用于字符串相等的is
关键字。
>>> s = 'str'
>>> s is 'str'
True
>>> s is 'st'
False
我尝试了__is__()
和__eq__()
,但它们都不起作用。
>>> 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
>>>
发布于 2010-06-07 16:27:04
is
运算符等同于比较id(x)
值。例如:
>>> 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中很少见,但它就是这样。
发布于 2010-06-07 16:27:42
Python is
关键字测试对象标识。您不应该使用它来测试字符串是否相等。它似乎经常工作,因为Python实现像许多非常高级的语言一样,执行字符串的“插入”。也就是说,字符串、文字和值在内部保存在一个散列列表中,而那些完全相同的字符串和值则呈现为对同一对象的引用。(这是可能的,因为Python字符串是不可变的)。
但是,与任何实现细节一样,您不应该依赖这一点。如果您想测试相等性,请使用==运算符。如果您真的想测试对象标识,那么使用is
-我很难想到您应该关心字符串对象标识的情况。不幸的是,你不能指望两个字符串是不是在某种程度上是“故意”相同的对象引用,因为前面提到的interning。
发布于 2010-06-07 16:26:22
is
关键字用于比较对象(或者,如果两个引用指向同一对象,则进行比较)。
我想,这就是为什么没有机制来提供你自己的实现。
它有时碰巧在字符串上工作,因为Python“巧妙地”存储字符串,这样当您创建两个相同的字符串时,它们被存储在一个对象中。
>>> a = "string"
>>> b = "string"
>>> a is b
True
>>> c = "str"+"ing"
>>> a is c
True
您可以在一个简单的“复制”示例中看到参考与数据比较:
>>> a = {"a":1}
>>> b = a
>>> c = a.copy()
>>> a is b
True
>>> a is c
False
https://stackoverflow.com/questions/2987958
复制相似问题