...的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
>>>
Answer 1:
与测试字符串is
只有当字符串实习工作。 除非你真的知道你在做什么,明确实习 ,你不应该使用的字符串is
在字符串。
is
身份 ,而不是平等的测试。 这意味着Python的只是一个比较对象驻留在内存地址。 is
基本上回答了这个问题:“我必须为同一对象两个人的名字?” - 超载那将毫无意义。
例如, ("a" * 100) is ("a" * 100)
为False。 通常Python的每个字符串写入到不同的存储位置,实习大多发生于字符串文字。
Answer 2:
的is
操作者等同于比较id(x)
值。 id
是当前实现使用指针作为比较。 所以,你不能超载is
本身,AFAIK你不能超载id
无论是。
所以,你不能。 不寻常的蟒蛇,但它就在那里。
Answer 3:
Python的is
关键字测试对象标识。 你不应该使用它来测试字符串是否相等。 这似乎经常工作,因为Python实现,像一颗颗非常高的水平语言,执行字符串的“实习”。 也就是说,字符串和值在内部保持在散列列表,以及那些是相同的呈现为同一个对象的引用。 (这是可能的,因为python的string是不可改变的)。
但是,与任何实现细节,你不应该依赖于这一点。 如果你想测试平等使用==操作符。 如果你真的想测试对象的身份,然后使用is
---和我会捉襟见肘拿出你应该关心的字符串对象身份的情况下。 不幸的是,你不能指望两个字符串是否在某种程度上,因为前述实习的“故意”相同的对象引用。
Answer 4:
的is
关键字进行比较的对象(或者说,如果比较两个引用是同一个对象)。
这是,我想,为什么没有任何机制来提供自己的实现。
它发生在对字符串工作有时因为Python店字符串“巧妙”,这样,当你创建两个相同的字符串它们存储在一个对象。
>>> a = "string"
>>> b = "string"
>>> a is b
True
>>> c = "str"+"ing"
>>> a is c
True
你可以看到希望的参考VS在一个简单的“复制”示例数据对比:
>>> a = {"a":1}
>>> b = a
>>> c = a.copy()
>>> a is b
True
>>> a is c
False
Answer 5:
如果你不害怕与字节码搞乱了的,你可以拦截和补丁COMPARE_OP
用8 ("is")
参数进行比较的对象你的钩子函数来调用。 看看dis
的启动模块文件。
而且不要忘了拦截__builtin__.id()
太多,如果有人会做id(a) == id(b)
而不是a is b
。
Answer 6:
是没有一个字符串变量比较字符串值,当该字符串开头两个字符串变量“ - ”。 我的Python版本是2.6.6
>>> s = '-hi'
>>> s is '-hi'
False
>>> s = '-hi'
>>> k = '-hi'
>>> s is k
False
>>> '-hi' is '-hi'
True
Answer 7:
“是”,而比较==值进行比较的对象的身份。
例:
a=[1,2]
b=[1,2]
#a==b returns True
#a is b returns False
p=q=[1,2]
#p==q returns True
#p is q returns True
Answer 8:
你不能重载is
运营商。 你想重载什么是==
操作符。 这可以通过定义来完成__eq__
在类方法。
Answer 9:
您正在使用的身份比较。 ==可能是你想要的东西。 唯一的例外情况是当你想进行检查,如果一个项目,另一个是完全相同的对象,并在相同的存储位置。 在你的例子,该项目的是不一样的,因为一个比另一个(串)不同类型(my_string)的。 此外,还有为SomeClass的没有这样的事情。 __is__
在蟒蛇(当然,除非你把它放在那里自己)。 如果有,用的是比较对象将不可靠简单地比较存储位置。
当我第一次遇到的是关键字,它混淆我的。 我本来以为是和==都没有变化。 他们制作了许多对象从解释输出相同。 这种类型的假设实际上是究竟是什么?是。 这是蟒蛇相当于“嘿,不要误以为这两个对象。他们是不同的。”,这基本上是什么[不管是谁,是理顺我出去]说。 措辞太多不同,但有一点==另一点。
在一些有用的例子和一些文字,以帮助有时混淆差异参观从python.org的邮件主机的文件通过“丹尼柳”写成
或者,如果是离线的,使用非上市引擎收录我把它的身体。
在他们的情况下,在约20个左右的蓝月(蓝月是一个真实的事件),都下来了,我会引用代码示例
###
>>> my_name = "danny"
>>> your_name = "ian"
>>> my_name == your_name
0 #or False
###
###
>>> my_name[1:3] == your_name[1:3]
1 #or True
###
###
>>> my_name[1:3] is your_name[1:3]
0
###
Answer 10:
断言错误容易出现与关键词是当比较对象。 例如,对象A和B可能拥有相同的价值,共享相同的内存地址。 因此,做一个
>>> a == b
会,以评估
True
但是,如果
>>> a is b
计算结果为
False
你应该检查
>>> type(a)
和
>>> type(b)
这些可能是不同的,对于失败的原因。
文章来源: How is the 'is' keyword implemented in Python?