我一直更喜欢这些:
not 'x' in 'abc'
not 'x' is 'a'
(当然,假设每个人都知道in
和is
--优先考虑not
--我可能应该使用括号)而不是更符合语法的(英语):
'x' not in 'abc'
'x' is not 'a'
但是直到我意识到它们在句法上没有意义,我才开始思考为什么
'x' == not 'a'
'x' not == 'a'
当然,两者都会抛出语法错误。
所以我认为它们都是两个单词的运算符。但是,documentation仅引用is not
,而没有提到not in
作为运算符。我是不是误解了语法?
如果它们都是运算符,那么它们与非语法对应的运算符是否完全不同(甚至是微妙的)?
如果它们是相同的,那么为什么它们还存在?它似乎对Zen of Python是不敬的(..“1最好只有一个--显而易见的方式”..)
我很抱歉,如果这个问题已经被讨论到死了,我只是在搜索“不是”这样的搜索条件下找到它的运气很差。
发布于 2010-02-06 02:18:14
来自Python2.6.4文档:http://docs.python.org/reference/expressions.html >
运算符not in被定义为具有in的逆真值。
运算符is和is不测试对象身份:当且仅当x和y是同一对象时,x is y为true。X不是y会产生相反的真值。
例如:"x not in y“与"not x in y”完全相同,"x is not y“与"not x is y”相同。
"x not == y“不能解析,但"x != y”可以解析,所以这里也有一个等价物...
HTH。
发布于 2010-02-06 03:49:58
使用dis模块可以很容易地检查是否有任何差异:
>>> dis.dis(compile('not a in b','','exec'))
1 0 LOAD_NAME 0 (a)
3 LOAD_NAME 1 (b)
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(compile('a not in b','','exec'))
1 0 LOAD_NAME 0 (a)
3 LOAD_NAME 1 (b)
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
看见?笨拙的第一种形式(经常使那些不能立即区分not
和in
运算符的相对优先级的人感到困惑)被编译成与唯一的not in
运算符完全相同的字节码。类似地:
>>> dis.dis(compile('not a is b','','exec'))
1 0 LOAD_NAME 0 (a)
3 LOAD_NAME 1 (b)
6 COMPARE_OP 9 (is not)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(compile('a is not b','','exec'))
1 0 LOAD_NAME 0 (a)
3 LOAD_NAME 1 (b)
6 COMPARE_OP 9 (is not)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
这两种形式--愚蠢、令人困惑的第一种形式和优雅的第二种形式--与完全相同的代码相比,都使用了is not
运算符。
当然,没有很好的理由使用那些会让读者感到困惑的表单(除非你喜欢为那些阅读你代码的人设置陷阱!),但就执行语义和速度而言,没有任何区别。
发布于 2010-02-06 02:23:58
您的问题的其余部分已经在上面得到了回答,但我将解决最后一个问题: Python的禅宗。
“应该只有一种方法去做”并不是数学意义上的意思。如果是的话,就不会有!=
运算符了,因为那只是==
的反转。类似地,没有and
和or
-毕竟,您可以只使用一个nand
命令。“单向”的咒语是有限度的:应该只有一种高层次的方法来做到这一点。当然,这种高层次的方式是可以分解的-你可以编写自己的math.tan
,而且你永远不需要使用urllib
- socket
总是在那里等着你。但是,正如urllib.open
是原始socket
操作的高级封装一样,not in
也是not
和in
的高级封装。你可能会说,这有点陈词滥调。但是您使用的是x != y
而不是not (x == y)
。
https://stackoverflow.com/questions/2211706
复制