pythonⅠ中的复合布尔逻辑

2024-09-29 23:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python测试一个基本前提,但总是失败,我不知道为什么。在

我的系统argv看起来像这样:

['test.py', 'test']

我的代码是这样的:

^{pr2}$

但这个测试从来都不是真的。我肯定我错过了一些非常简单的东西,但我不知道是什么。在


Tags: 代码pytest系统argvpr2试图用基本前提
1条回答
网友
1楼 · 发布于 2024-09-29 23:31:31

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

import sys

print id(sys.argv[1])
print id('test')

我的输出:

^{pr2}$

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

这里的问题是实习的概念。当您将两个完全相同的字符串硬编码到源代码中时,这些字符串将被截获,并且这两个字符串将共享一个对象ID(这解释了@SamMussmann下面非常有效的一点)。但是当您通过argv传入一个字符串时,会创建一个新对象,从而与代码返回False中相同的硬编码字符串进行比较。到目前为止,我发现的最好的解释是在here中,Alex Martelli和jonskeet(两个非常有声望的消息来源)都解释了interning和字符串何时被interneted。从这些解释来看,似乎是因为来自argv的数据是程序外部的,所以这些值没有被内联,因此与源中的两个文本相比,它们具有不同的对象ID。在

另外一个有趣的点(与手头的问题无关,但与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

相关问题 更多 >

    热门问题