Python:为什么(“你好”是“你好”)评价为True?

时间:2009-09-08 07:13:19

标签: python identity string-comparison object-comparison

为什么"hello" is "hello"在Python中产生True

我阅读了以下here

  

如果两个字符串文字相同,则将它们放在一起    记忆位置。字符串是不可变的实体。没有害处    完成。

因此每个Python字符串在内存中只有一个位置?听起来很奇怪。这是怎么回事?

7 个答案:

答案 0 :(得分:86)

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

另一个礼物:"hell" + "o" is "hello" ==> True

答案 1 :(得分:61)

  

所以每个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实现也不安全。

答案 2 :(得分:13)

文字字符串可能根据其哈希值或类似内容进行分组。两个相同的文字字符串将存储在同一个内存中,任何引用都会引用它。

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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