63

为什么用 Python"hello" is "hello"生成?True

我在这里阅读了以下内容:

如果两个字符串文字相等,则它们已被放入相同的内存位置。字符串是不可变的实体。不能造成任何伤害。

那么每个 Python 字符串在内存中只有一个位置吗?听起来很奇怪。这里发生了什么?

4

7 回答 7

93

Python(如 Java、C、C++、.NET)使用字符串池/实习。解释器意识到“hello”和“hello”是一样的,所以它优化并使用内存中的相同位置。

另一个好东西:"hell" + "o" is "hello"==>True

于 2009-09-08T07:15:09.333 回答
64

那么每个 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

所以不要依赖'string'就是'string':即使只看C实现也是不安全的。

于 2009-09-08T09:19:59.297 回答
13

文字字符串可能根据它们的散列或类似的东西进行分组。两个相同的文字字符串将存储在同一内存中,并且任何引用都引用它。

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------
于 2009-09-08T07:16:34.943 回答
6

is如果两个参数是同一个对象,则运算符返回 true 。你的结果是这个和引用位的结果。

在字符串文字的情况下,这些是实习的,这意味着它们与已知字符串进行比较。如果已知相同的字符串,则文字采用该值,而不是替代值。因此,它们成为同一个对象,表达式为真。

于 2009-09-08T07:16:54.930 回答
2

Python 解释器/编译器解析字符串文字,即引用的字符列表。当它这样做时,它可以检测到“我以前见过这个字符串”,并使用与上次相同的表示。它可以这样做,因为它知道以这种方式定义的字符串不能更改。

于 2009-09-08T07:16:24.723 回答
1

为什么奇怪。如果字符串是不可变的,那么只存储一次就很有意义。.NET 具有相同的行为。

于 2009-09-08T07:14:42.920 回答
0

我认为如果任何两个变量(不仅仅是字符串)包含相同的值,则该值将只存储一次而不是两次,并且两个变量都将指向同一个位置。这样可以节省内存。

于 2009-09-08T09:20:17.377 回答