Python:为什么(“ Hello”是“ Hello”)评估为真? [复制
-
21-09-2019 - |
题
这个问题在这里已经有一个答案:
- 关于不变的字符串的变化ID 5个答案
为什么 "hello" is "hello"
生产 True
在python?
我读了以下内容 这里:
如果两个字符串文字相等,则将它们放在同一内存位置。字符串是一个不变的实体。无法造成伤害。
因此,每个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
同样,对于INT:
>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False
因此,不要依靠“字符串”是“字符串”:即使只是查看C实现,也不安全。
字面字符串可能是根据其哈希(Hash)或类似内容进行分组的。相同的两个字符串将存储在相同的内存中,任何参考都指的是。
Memory Code
-------
| myLine = "hello"
| /
|hello <
| \
| myLine = "hello"
-------
这 is
如果两个参数都是同一对象,则操作员返回true。您的结果是结果,并引用了一点。
对于字符串文字,这些是实施的,这意味着它们与已知的字符串进行了比较。如果已经知道了相同的字符串,则具有字面的字符串,而不是替代价值。因此,它们成为相同的对象,并且表达是正确的。
Python解释器/编译器解析了字符串文字,即引用的字符列表。当这样做时,它可以检测“我之前已经看过此字符串”,并使用与上次相同的表示形式。它可以做到这一点,因为它知道以这种方式定义的字符串无法更改。
为什么这很奇怪。如果字符串是不可变的,那么仅存储一次就很有意义。 .NET具有相同的行为。
我认为,如果任何两个变量(不仅仅是字符串)包含相同的值,则该值将仅存储一次,而不是两次,并且两个变量都将指向同一位置。这可以节省内存。