Python: 为什么("hello" is "hello")返回 True?
为什么在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
。