这个问题在这里已经有一个答案:

为什么 "hello" is "hello" 生产 True 在python?

我读了以下内容 这里:

如果两个字符串文字相等,则将它们放在同一内存位置。字符串是一个不变的实体。无法造成伤害。

因此,每个python字符串中的内存中只有一个而且只有一个地方吗?听起来很奇怪。这里发生了什么?

有帮助吗?

解决方案

Python(例如Java,C,C ++,.NET)使用字符串池 /实习。解释器意识到“ Hello”与“ Hello”相同,因此它优化并在内存中使用相同的位置。

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

其他提示

因此,每个python字符串中的内存中只有一个而且只有一个地方吗?

不,只有口译员决定优化的人,这是基于不属于语言规范且可能在不同CPYTHON版本中改变的策略的决定。

例如。在我的安装(2.6.2 Linux)上:

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

同样,对于INT:

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

因此,不要依靠“字符串”是“字符串”:即使只是查看C实现,也不安全。

字面字符串可能是根据其哈希(Hash)或类似内容进行分组的。相同的两个字符串将存储在相同的内存中,任何参考都指的是。

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

is 如果两个参数都是同一对象,则操作员返回true。您的结果是结果,并引用了一点。

对于字符串文字,这些是实施的,这意味着它们与已知的字符串进行了比较。如果已经知道了相同的字符串,则具有字面的字符串,而不是替代价值。因此,它们成为相同的对象,并且表达是正确的。

Python解释器/编译器解析了字符串文字,即引用的字符列表。当这样做时,它可以检测“我之前已经看过此字符串”,并使用与上次相同的表示形式。它可以做到这一点,因为它知道以这种方式定义的字符串无法更改。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top