2024-09-29 23:31:31 发布
网友
我试图用python测试一个基本前提,但总是失败,我不知道为什么。在
我的系统argv看起来像这样:
['test.py', 'test']
我的代码是这样的:
但这个测试从来都不是真的。我肯定我错过了一些非常简单的东西,但我不知道是什么。在
如上所述,主要原因是您的test比较。使用is与使用==不同,因为它在两个对象相等的情况下进行比较。在这种情况下,您可以通过检查它们的ID来验证它们是否不相等:
test
is
==
import sys print id(sys.argv[1]) print id('test')
我的输出:
当它们指向不同的对象时,它们在使用is时将不相等(但是使用==将比较字符串本身,这将返回True)。在
True
这里的问题是实习的概念。当您将两个完全相同的字符串硬编码到源代码中时,这些字符串将被截获,并且这两个字符串将共享一个对象ID(这解释了@SamMussmann下面非常有效的一点)。但是当您通过argv传入一个字符串时,会创建一个新对象,从而与代码返回False中相同的硬编码字符串进行比较。到目前为止,我发现的最好的解释是在here中,Alex Martelli和jonskeet(两个非常有声望的消息来源)都解释了interning和字符串何时被interneted。从这些解释来看,似乎是因为来自argv的数据是程序外部的,所以这些值没有被内联,因此与源中的两个文本相比,它们具有不同的对象ID。在
argv
False
另外一个有趣的点(与手头的问题无关,但与is讨论相关)是用数字完成的缓存。从-5到256的数字被缓存,这意味着is与该范围内的相等数字的比较将是正确的,而不管它们是如何计算的:
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
如上所述,主要原因是您的
test
比较。使用is
与使用==
不同,因为它在两个对象相等的情况下进行比较。在这种情况下,您可以通过检查它们的ID来验证它们是否不相等:我的输出:
^{pr2}$当它们指向不同的对象时,它们在使用
is
时将不相等(但是使用==
将比较字符串本身,这将返回True
)。在这里的问题是实习的概念。当您将两个完全相同的字符串硬编码到源代码中时,这些字符串将被截获,并且这两个字符串将共享一个对象ID(这解释了@SamMussmann下面非常有效的一点)。但是当您通过
argv
传入一个字符串时,会创建一个新对象,从而与代码返回False
中相同的硬编码字符串进行比较。到目前为止,我发现的最好的解释是在here中,Alex Martelli和jonskeet(两个非常有声望的消息来源)都解释了interning和字符串何时被interneted。从这些解释来看,似乎是因为来自argv
的数据是程序外部的,所以这些值没有被内联,因此与源中的两个文本相比,它们具有不同的对象ID。在另外一个有趣的点(与手头的问题无关,但与
is
讨论相关)是用数字完成的缓存。从-5到256的数字被缓存,这意味着is
与该范围内的相等数字的比较将是正确的,而不管它们是如何计算的:相关问题 更多 >
编程相关推荐