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

为什么在Python中"hello" is "hello" == True

我在这里阅读以下内容:

如果两个string文字相等,则它们被放到相同的内存位置。 一个string是一个不可变的实体。 没有伤害可以做。

那么每个Pythonstring在内存中只有一个地方? 听起来很奇怪。 这里发生了什么?

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

另一个好东西:“地狱”+“o”是“你好”==>真

那么每个Pythonstring在内存中只有一个地方?

不,只有解释者决定优化,这是基于不属于语言规范的政策的决定,可能会在不同的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的实现也是不安全的。

文字string可能是基于他们的散列或类似的东西分组。 两个相同的文字string将被存储在相同的内存中,任何引用都是指那个。

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

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

在string文字的情况下,这些文字是实际的,这意味着它们与已知string进行比较。 如果一个相同的string已经是已知的,那么这个字面值就是这个值,而不是另一个值。 因此,他们成为同一个对象,expression是真实的。

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

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

我认为,如果任何两个variables(不只是string)包含相同的值,该值将只存储一次而不是两次,并且这两个variables将指向相同的位置。 这节省了内存。