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