为什么"hello" is "hello"
在Python中产生True
?
我阅读了以下here:
如果两个字符串文字相同,则将它们放在一起 记忆位置。字符串是不可变的实体。没有害处 完成。
因此每个Python字符串在内存中只有一个位置?听起来很奇怪。这是怎么回事?
答案 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)
我认为如果任何两个变量(不仅仅是字符串)包含相同的值,则该值将仅存储一次而不是两次,并且两个变量将指向相同的位置。这样可以节省内存。