我尝试理解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 尝试重用现有的不可变对象,通过让其他变量指向它们,而不是在内存中创建具有相同值的新对象。
考虑到这一点,示例 1
显然返回 True
。
对我来说,示例 2
仍然很明显返回 True
。
对于我来说,示例 3
并不明显返回 False
- 我没有像在 示例 2
中那样做吗?!?
我偶然发现了这个 SO 问题:
为什么在 Python 中使用 '==' 或 'is' 比较字符串有时会产生不同的结果?
我阅读了http://guilload.com/python-string-interning/(尽管我可能没有完全理解),并想 - 好吧,也许“intern”字符串取决于长度,所以我在 示例 4
中使用了HelloHelloHelloHelloHello
。结果是 True
。
让我感到困惑的是,只是用一个更大的数字做与 示例 4
相同的事情(但实际上会返回相同的字符串) - 然而这次结果是 False
?!?
我真的不知道 Python 如何决定是否使用相同的内存对象,或何时创建新对象。
有任何官方来源可以解释这种行为吗?
sys.intern()
对字符串进行内部化处理即可。否则,就像你所知道的,规则是特定于实现的,因此不被Python文档记录。 - Chris_Rands