【发布时间】:2018-03-22 11:10:17
【问题描述】:
我试图了解 Python 字符串何时相同(也就是共享相同的内存位置)。但是在我的测试中,当两个相等的字符串变量共享相同的内存时,似乎没有明显的解释:
import sys
print(sys.version) # 3.4.3
# Example 1
s1 = "Hello"
s2 = "Hello"
print(id(s1) == id(s2)) # True
# Example 2
s1 = "Hello" * 3
s2 = "Hello" * 3
print(id(s1) == id(s2)) # True
# Example 3
i = 3
s1 = "Hello" * i
s2 = "Hello" * i
print(id(s1) == id(s2)) # False
# Example 4
s1 = "HelloHelloHelloHelloHello"
s2 = "HelloHelloHelloHelloHello"
print(id(s1) == id(s2)) # True
# Example 5
s1 = "Hello" * 5
s2 = "Hello" * 5
print(id(s1) == id(s2)) # False
字符串是不可变的,据我所知,Python 试图重用现有的不可变对象,方法是让其他变量指向它们,而不是在内存中创建具有相同值的新对象。
考虑到这一点,Example 1 返回True 似乎很明显。
(对我来说)Example 2 返回True 仍然很明显。
Example 3 返回False 对我来说并不明显——我在做的事情和Example 2 不一样吗?!?
我偶然发现了这个 SO 问题:
Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?
并通读http://guilload.com/python-string-interning/(虽然我可能没有完全理解),然后想——好吧,也许“实习”字符串取决于长度,所以我在Example 4 中使用了HelloHelloHelloHelloHello。结果是True。
让我感到困惑的是,与Example 2 中的操作相同,只是使用更大的数字(但它实际上会返回与Example 4 相同的字符串) - 但是这次结果是False?!?
我真的不知道 Python 如何决定是否使用同一个内存对象,或者何时创建一个新对象。
有任何官方资料可以解释这种行为吗?
【问题讨论】:
-
我不明白为什么示例 2 和示例 5 会给出不同的结果。
-
你为什么在乎?如果您想强制执行此操作,则只需使用
sys.intern()实习字符串,否则规则是特定于您所知道的实现,因此 Python 没有记录 -
您提供的第二个链接非常详细。 Stack Overflow 的答案不太可能比该链接更好。您问题中的最后一句话实际上是题外话(尽管这无疑不是您的意图)。