我正在尝试在 python 中测试一个基本前提,但它总是失败,我不知道为什么。
我的 sys.argv 看起来像这样:
['test.py', 'test']
我的代码如下所示:
if len(sys.argv) > 1 and sys.argv[1] is 'test':
print 'Test mode'
但测试永远不会是真的。我确信我在这里遗漏了一些非常简单的东西,但我无法弄清楚它是什么。
我正在尝试在 python 中测试一个基本前提,但它总是失败,我不知道为什么。
我的 sys.argv 看起来像这样:
['test.py', 'test']
我的代码如下所示:
if len(sys.argv) > 1 and sys.argv[1] is 'test':
print 'Test mode'
但测试永远不会是真的。我确信我在这里遗漏了一些非常简单的东西,但我无法弄清楚它是什么。
如上所述,主要原因是您的test
比较。Usingis
与 using 不同,==
因为它比较两个对象是否相等。在这种情况下,您可以通过检查它们的 id 来验证它们是否不相等:
import sys
print id(sys.argv[1])
print id('test')
我的输出:
140335994263232
140335994263424
由于它们指向不同的对象,因此在使用时它们将不相等is
(但使用==
将比较字符串本身,这将返回True
)。
这里的问题是实习的概念。当您将两个相同的字符串硬编码到您的源中时,这些字符串将被保留,并且两者将共享一个对象 ID(这解释了 @SamMussmann 下面的非常有效的观点)。但是,当您在 via 中传递一个字符串时argv
,会创建一个新对象,从而与代码中的相同硬编码字符串进行比较 return 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