为什么用 Python"hello" is "hello"
生成?True
我在这里阅读了以下内容:
如果两个字符串文字相等,则它们已被放入相同的内存位置。字符串是不可变的实体。不能造成任何伤害。
那么每个 Python 字符串在内存中只有一个位置吗?听起来很奇怪。这里发生了什么?
为什么用 Python"hello" is "hello"
生成?True
我在这里阅读了以下内容:
如果两个字符串文字相等,则它们已被放入相同的内存位置。字符串是不可变的实体。不能造成任何伤害。
那么每个 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
同样对于整数:
>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False
所以不要依赖'string'就是'string':即使只看C实现也是不安全的。
文字字符串可能根据它们的散列或类似的东西进行分组。两个相同的文字字符串将存储在同一内存中,并且任何引用都引用它。
Memory Code
-------
| myLine = "hello"
| /
|hello <
| \
| myLine = "hello"
-------
is
如果两个参数是同一个对象,则运算符返回 true 。你的结果是这个和引用位的结果。
在字符串文字的情况下,这些是实习的,这意味着它们与已知字符串进行比较。如果已知相同的字符串,则文字采用该值,而不是替代值。因此,它们成为同一个对象,表达式为真。
Python 解释器/编译器解析字符串文字,即引用的字符列表。当它这样做时,它可以检测到“我以前见过这个字符串”,并使用与上次相同的表示。它可以这样做,因为它知道以这种方式定义的字符串不能更改。
为什么奇怪。如果字符串是不可变的,那么只存储一次就很有意义。.NET 具有相同的行为。
我认为如果任何两个变量(不仅仅是字符串)包含相同的值,则该值将只存储一次而不是两次,并且两个变量都将指向同一个位置。这样可以节省内存。