Python的:为什么(“你好”是“你好”)评估为真? [重复](Python: Why doe

2019-07-05 14:56发布

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

  • 关于一个不变的字符串的改变ID的 5个答案

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

我阅读下列这里 :

如果两个字符串文字都是平等的,他们已经投入相同的存储空间。 字符串是不可变的实体。 没有伤害可以做到的。

因此,有且仅有一个内存位置为每一个Python字符串? 听起来很奇怪。 这里发生了什么?

Answer 1:

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

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



Answer 2:

因此,有且仅有一个内存位置为每一个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实现很不安全。



Answer 3:

文字字符串是基于其散列或类似的东西可能分组。 同样的文字字符串中的两个将被存储在相同的内存,并且任何引用都引用了这一点。

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


Answer 4:

is运营商,如果两个参数是相同的对象返回true。 你的结果是这样做的结果,并引述位。

在字符串的情况下,这些被拘留,这意味着他们相比,已知的字符串。 如果相同的字符串是已知的,字面需要,而不是替代一个值。 因此,它们成为同一对象,并且表达式为真。



Answer 5:

Python解释器/编译器解析字符串常量,即人物的报价列表。 这样做时,它可以检测到“我见过这个字符串”,并使用相同的表示为最后一次。 它可以做到这一点,因为它知道,以这种方式定义的字符串不能改变。



Answer 6:

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



Answer 7:

我想,如果有两个变量(不只是字符串)包含相同的值,该值将只存储一次不是两次,两个变量将指向同一位置。 这样可以节省内存。



文章来源: Python: Why does (“hello” is “hello”) evaluate as True? [duplicate]