Python: 为什么("hello" is "hello")返回 True?

63 投票
7 回答
22843 浏览
提问于 2025-04-15 14:08

为什么在Python中,"hello" is "hello"会返回True呢?

我在这里读到:

如果两个字符串字面量相等,它们就会被放在同一个内存位置。字符串是不可变的东西,没什么坏处。

所以每个Python字符串在内存中只有一个地方?这听起来有点奇怪。到底是怎么回事呢?

7 个回答

13

字面字符串可能是根据它们的哈希值或者类似的东西进行分组的。两个相同的字面字符串会存储在同一块内存里,任何对它们的引用都会指向那一块内存。

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------
66

那么每个Python字符串在内存中只有一个地方吗?

不是的,只有那些解释器决定要优化的字符串才会这样,这个决定是基于一些政策,而这些政策并不是语言规范的一部分,并且在不同的CPython版本中可能会有所变化。

比如,在我的安装版本(2.6.2 Linux)中:

>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False

整数也是类似的情况:

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False

所以不要依赖于'字符串'是'字符串'这种说法;即使从C语言的实现来看,这种说法也不安全。

95

Python(就像Java、C、C++和.NET一样)使用了一种叫做字符串池的技术。这个技术的意思是,当解释器发现两个字符串“hello”是一样的时候,它会进行优化,直接使用内存中的同一个位置来存储这个字符串。

还有一个有趣的点:"hell" + "o" 结果是 "hello",这是真的,结果是True

撰写回答