python中的复合布尔逻辑if

tha*_*awg 5 python

我试图在python中测试一个基本前提,它总是失败,我无法弄清楚为什么.

我的sys.argv看起来像这样:

['test.py', 'test']
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

if len(sys.argv) > 1 and sys.argv[1] is 'test':
    print 'Test mode'
Run Code Online (Sandbox Code Playgroud)

但测试从未如此.我确信我在这里遗漏了一些非常简单的东西,但我无法弄清楚它是什么.

Roc*_*key 8

如上所述,主要原因是你的test比较.使用is与使用不同,==因为它比较两个对象是否相等.在这种情况下,您可以通过检查其ID来验证它们不相等:

import sys

print id(sys.argv[1])
print id('test')
Run Code Online (Sandbox Code Playgroud)

我的输出:

140335994263232
140335994263424
Run Code Online (Sandbox Code Playgroud)

当它们指向不同的对象时,它们在使用时将不相等is(但是使用它们==将比较字符串本身,它们将返回True).

这里的问题是实习的概念.当您将两个相同的字符串硬编码到源中时,字符串将被实现,两者将共享一个对象ID(这解释了@ SamMussmann在下面非常有效的点).但是当你在via中传递一个字符串时argv,会创建一个新对象,从而在代码返回时与相同的硬编码字符串进行比较False.到目前为止,我发现的最好的解释是在这里,Alex Martelli和Jon Skeet(两个非常有信誉的消息来源)解释了实习并且当字符串被实习时.根据这些解释,似乎由于数据来自argv程序外部,因此值不会被实现,因此具有不同的对象ID,而不是它们都是源中的文字.

另一个兴趣点(与手头的问题无关,但与is讨论相关)是使用数字进行的缓存.缓存从-5到256的数字,这意味着is无论计算方式如何,该范围内相等数字的比较都将为True:

In [1]: 256 is 255 + 1
Out[1]: True

In [2]: 257 is 256 + 1
Out[2]: False

In [3]: -5 is -4 - 1
Out[3]: True

In [4]: -6 is -5 - 1
Out[4]: False
Run Code Online (Sandbox Code Playgroud)

  • @SamMussmann那是因为在你的测试中你使用了字符串文字.Python在列表中放置了相同的interned字符串,因此它们实际上是同一个对象.所以测试通过.但这不是'is`运算符的正确使用.如果要比较相等性,请使用`==`. (2认同)