我来自ac风格的语言,所以我很自然地使用!=不相等,但当我来到Python时,从我阅读的文档中,我了解到为此目的使用了<>运算符.
最近,我看到很多代码使用!=,所以我的问题是,如果其中一个优先于另一个,或者其中一个被弃用.
另外,我想知道它们之间是否有任何区别.
参考 - http://docs.python.org/library/unittest.html#assert-methods
assertEqual(a, b) # checks that a == b
assertIs(a, b) # checks that a is b <---- whatever that means????
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码段:
my_string = 'asdf'
print(my_string is 'xfje') #R0123
Run Code Online (Sandbox Code Playgroud)
Pylint R0123在第二行返回推荐,我在错误消息wiki上找不到.不过,在这部分文档中提到了它:
文字比较(R0123):
与文字的比较在将对象与文字进行比较时使用,这通常是您不想做的事情,因为您可以比较不同于预期的文字.
这个解释对我没有任何帮助.我知道is用于两个字符串对象之间的比较可能会导致与预期不同的结果,但是为了将对象与文字进行比较,它与之相同==.使用时==,错误消失.
我为什么不在is这里使用?
我无法理解以下行为.我正在创建2个字符串,并使用is运算符来比较它.在第一种情况下,它的工作方式不同.在第二种情况下,它按预期工作.我使用逗号或空格的原因是什么,它False与比较is时显示,当没有使用逗号,空格或其他字符时,它给出True
Python 3.6.5 (default, Mar 30 2018, 06:41:53)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 'string'
>>> b = a
>>> b is a
True
>>> b = 'string'
>>> b is a
True
>>> a = '1,2,3,4'
>>> b = a
>>> b is a
True
>>> b = '1,2,3,4'
>>> b is a
False
Run Code Online (Sandbox Code Playgroud)
有关python以不同方式解释字符串的原因的可靠信息吗?我最初理解,a并b指同一个对象.然后说 …
哪个更好?(为什么?)
if somevalue == False:
Run Code Online (Sandbox Code Playgroud)
要么
if somevalue is False:
Run Code Online (Sandbox Code Playgroud)
如果somevalue是字符串,你的答案会改变吗?
我知道python的“是”比较使用对象的ID进行比较,但是在比较与自身串联的字符串时,它的行为似乎不一致。最多20个字符,对于单个字符str,返回True,然后返回False:
>>>'a'*20 is 'a'*20
True
>>>'a'*21 is 'a'*21
False
Run Code Online (Sandbox Code Playgroud)
对于不同长度的字符串,似乎总字符串超过21的地方都会发生:
>>>'abcdefghijk'*2 is 'abcdefghijk'*2
False
>>>'abcdefghijk'*1 is 'abcdefghijk'*1
True
Run Code Online (Sandbox Code Playgroud)
但这不适用于已经超过21个字符的字符串:
>>>'abcdefghijklmnopqrstuvwxyz'*1 is 'abcdefghijklmnopqrstuvwxyz'*1
True
Run Code Online (Sandbox Code Playgroud)
python在做什么导致这种行为改变?
编辑:我正在使用Python 3.6.5
我是python的新手,我正在探索它的一些核心功能.
你能解释一下为什么下面的例子总是在带有特殊字符的字符串时返回false:
>>> a="x"
>>> b="x"
>>> a is b
True
>>> a="xxx"
>>> b="xxx"
>>> a is b
True
>>> a="xü"
>>> b="xü"
>>> a is b
False
>>> a="ü"
>>> b="ü"
>>> a is b
True
>>> #strange: with one special character it works as expected
Run Code Online (Sandbox Code Playgroud)
我知道每个赋值中具有特殊字符的字符串的存储位置不同,我已经使用id()函数检查了它,但是为什么python以这种不一致的方式处理字符串?
今天我被一个字符串比较困惑:似乎python重用了字符串(这是一个明智的做法,因为它们是不可变的).为了检查这个事实,我做了以下事情:
>>> a = 'xxx'
>>> b = 'xxx'
>>> a == b
True
>>> a is b
True
>>> id(a)
140141339783816
>>> id(b)
140141339783816
>>> c = 'x' * 3
>>> id(c)
140141339783816
>>> d = ''.join(['x', 'x', 'x'])
>>> id(d)
140141339704576
Run Code Online (Sandbox Code Playgroud)
这有点令人惊讶.一些问题:
如果我跑,我会得到什么is,==做什么以及为什么
a = "ab"
b = "ab"
a == b
Run Code Online (Sandbox Code Playgroud)
我得到True.这里的问题是为什么会发生这种情况:
a = "ab"
b = "ab"
a is b # Returns True
Run Code Online (Sandbox Code Playgroud)
所以我做了我的研究,我找到了这个.答案说Python解释器使用字符串池.因此,如果它看到两个字符串相同,则将它们分配id给新字符串以进行优化.
直到这里一切都好,并回答.我真正的问题是为什么这个池只发生在一些字符串上.这是一个例子:
a = "ab"
b = "ab"
a is b # Returns True, as expected knowing Interpreter uses string pooling
a = "a_b"
b = "a_b"
a is b # Returns True, again, as expected knowing Interpreter uses string …Run Code Online (Sandbox Code Playgroud) python ×9
string ×4
python-3.x ×2
boolean ×1
cpython ×1
deprecated ×1
equality ×1
identity ×1
not-operator ×1
pylint ×1
python-2.7 ×1
string-pool ×1
unit-testing ×1