Python中的字符串比较:是vs ==

Coq*_*cot 524 python string comparison equality

我注意到我写的一个Python脚本是松散的,并将其追溯到一个无限循环,循环条件是while line is not ''.在调试器中运行它,事实证明该行''.当我改为!=''而不是is not '',它工作得很好.

另外,通常认为默认情况下使用'=='会更好,即使在比较int或Boolean值时也是如此?我一直喜欢使用'是'因为我发现它更美观和pythonic(这就是我陷入这个陷阱...),但我想知道它是否只是为了保留当你关心找到两个具有相同id的对象.

dan*_*n04 589

对于所有内置Python对象(如字符串,列表,dicts,函数等),如果x为y,则x == y也为True.

不总是.NaN是一个反例.但通常,identity(is)意味着相等(==).反之亦然:两个不同的对象可以具有相同的值.

另外,通常认为默认情况下使用'=='会更好,即使在比较int或Boolean值时也是如此?

==在比较值和is比较身份时使用.

在比较整数(或一般的不可变类型)时,你几乎总是想要前者.有一个优化允许小整数与之比较is,但不依赖它.

对于布尔值,您根本不应该进行比较.代替:

if x == True:
    # do something
Run Code Online (Sandbox Code Playgroud)

写:

if x:
    # do something
Run Code Online (Sandbox Code Playgroud)

为了比较None,is None优先于== None.

我一直喜欢使用'是'因为我发现它更美观和pythonic(这就是我陷入这个陷阱...),但我想知道它是否只是为了保留当你关心找到两个具有相同id的对象.

是的,这正是它的用途.

  • @Coquelicot:这不行,因为Python允许任何东西用作布尔表达式.如果你有bool_a == 3和bool_b == 4,那么bool_a!= bool_b,但是bool_a xor bool_b是假的(因为两个术语都是真的). (4认同)
  • 对于今后看这些人的人来说,这仍然适用于Python 3. (4认同)
  • @Mike:`x是x`总是为True.但这并不意味着`x == x`.NaN被定义为不等于它自己. (3认同)
  • 关于速度,我虽然用于检查字符串是否被修改(例如从re.sub返回的结果)比较`is`相等的大字符串而不是`==`会更快.几乎没有一个时间表显示仅仅**0.4%**的速度提升.在我的情况下,re.sub将来开始更改字符串的风险是不值得的. (3认同)
  • @beauxq:试试`nan = float('nan'); nan是nan; nan == nan` (2认同)
  • @technazi:来自OP。 (2认同)
  • ” “并不总是如此。NaN 是一个反例。+1 表示迂腐。 (2认同)

pyg*_*iel 253

我想展示一个关于如何is==参与不可变类型的小例子.试试看:

a = 19998989890
b = 19998989889 +1
>>> a is b
False
>>> a == b
True
Run Code Online (Sandbox Code Playgroud)

is比较内存中的两个对象,==比较它们的值.例如,您可以看到Python缓存了小整数:

c = 1
b = 1
>>> b is c
True
Run Code Online (Sandbox Code Playgroud)

您应该==在比较值和is比较身份时使用.(另外,从英语的角度来看,"等于"与"是"不同.)

  • 这是一个有字符串:``x ='foo'; y ='bar'.replace('bar','foo'); (x是y)== False`` (5认同)
  • 另一个简单的例子,`datetime.date.today()== datetime.date.today()`==> True但是`datetime.date.today是datetime.date.today()`==> False因为它们是等价的日期对象,但它们仍然是不同的对象. (4认同)
  • 你的建议避免的另一个危险的例子:`str(None)是'None'`评估为'False`但是`str(None)=='None'`评估为'True` (4认同)
  • 我喜欢的另一个例子:'a'*50 =='a'*50(返回True),而'a'*50是'a'*50(返回False) (3认同)

小智 67

逻辑没有缺陷.该声明

如果x是y,那么x == y也是True

永远不应该被理解为

如果x == y则x为y

读者认为逻辑陈述的反转是正确的,这是一个逻辑错误.见http://en.wikipedia.org/wiki/Converse_(logic)


pyc*_*uft 26

看到这个问题

你的阅读逻辑

对于所有内置Python对象(如字符串,列表,dicts,函数等),如果x为y,则x == y也为True.

有点缺陷.

如果is适用==则将为True,但它不适用于反向.==可能会产生True而is产量为False.