这个问题已经在这里有一个答案:
- 关于一个不变的字符串的改变ID的 5个答案
为什么"hello" is "hello"
产生True
在Python?
我阅读下列这里 :
如果两个字符串文字都是平等的,他们已经投入相同的存储空间。 字符串是不可变的实体。 没有伤害可以做到的。
因此,有且仅有一个内存位置为每一个Python字符串? 听起来很奇怪。 这里发生了什么?
这个问题已经在这里有一个答案:
为什么"hello" is "hello"
产生True
在Python?
我阅读下列这里 :
如果两个字符串文字都是平等的,他们已经投入相同的存储空间。 字符串是不可变的实体。 没有伤害可以做到的。
因此,有且仅有一个内存位置为每一个Python字符串? 听起来很奇怪。 这里发生了什么?
的Python(如Java,C,C ++,.NET)使用字符串池/实习。 解释意识到“你好”是一样的“你好”,所以它优化和内存使用相同的位置。
另一个礼包: "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
所以不要依赖于“字符串”是“字符串”:哪怕只是看着C实现很不安全。
文字字符串是基于其散列或类似的东西可能分组。 同样的文字字符串中的两个将被存储在相同的内存,并且任何引用都引用了这一点。
Memory Code
-------
| myLine = "hello"
| /
|hello <
| \
| myLine = "hello"
-------
的is
运营商,如果两个参数是相同的对象返回true。 你的结果是这样做的结果,并引述位。
在字符串的情况下,这些被拘留,这意味着他们相比,已知的字符串。 如果相同的字符串是已知的,字面需要,而不是替代一个值。 因此,它们成为同一对象,并且表达式为真。
Python解释器/编译器解析字符串常量,即人物的报价列表。 这样做时,它可以检测到“我见过这个字符串”,并使用相同的表示为最后一次。 它可以做到这一点,因为它知道,以这种方式定义的字符串不能改变。
为什么是很奇怪。 如果字符串是不可变这让很多的意义,只存储一次。 .NET具有相同的行为。
我想,如果有两个变量(不只是字符串)包含相同的值,该值将只存储一次不是两次,两个变量将指向同一位置。 这样可以节省内存。