刚遇到这个问题,它让我感到困惑!我的代码只想比较song[-3:] is "mp3"
,如果我没有使用is
,那就会通过,但是通过我对理解中的所有耐心,我发现了一种奇特的行为。我知道is
据说测试看两个东西是同一个实例还是其他东西,但是当值相同时,为什么,为什么,它会失败?当我使用is
运算符测试一行(另一行)上的两个字符串的ID时,==
运算符:
>>> id("String"[-3:]), id("String"[-3:])
(4347723880, 4347723880)
>>> id("String"[-3:])
4347241952
>>> "String"[-3:] is "String"[-3:]
False
>>> "String"[-3:] == "String"[-3:]
True
所以我想我的问题是,当我使用is
时,或者在单独的一行上测试时,为什么id会改变,而不是在同一行上?这是一个奇怪的例外吗,或者这是我的一些疏忽?
答案 0 :(得分:3)
is
测试它们是否是相同的字符串,而不仅仅是相同的字符串。由于字符串是不可变的,因此如果您要求具有相同值的字符串,Python可以选择重用旧字符串 - 您遇到的情况是它确实选择执行此操作。正如你所见,它并不总是如此。 时的规则是否得到保证。要在所有情况下获得正确的结果,请随时使用str1 == str2
"这些字符串是否包含所有相同的字母"。
答案 1 :(得分:0)
这是因为当你这样做时:
"String"[-3:] is "String"[-3:]
python创建两个具有不同id的不同对象。
答案 2 :(得分:0)
当你调用"String"[-3:]
时,python会给你一个字符串对象。如果有一个相同的str。两个str应该是一样的。但是,如果你没有将"String"[-3:]
分配给变量。"String"[-3:]
将会“消失”。我测试过你是否使用a="String"[-3:]
。然后"String"[-3:]
的id不再改变