Python:为什么("你好"是"你好")评价为True?

Den*_*gan 56 python identity string-comparison object-comparison

为什么用Python "hello" is "hello"生成True

我在这里阅读以下内容:

如果两个字符串文字相等,则它们被放在相同的内存位置.字符串是不可变的实体.不会造成伤害.

因此,每个Python字符串在内存中只有一个位置?听起来很奇怪.这里发生了什么?

car*_*arl 87

Python(如Java,C,C++,.NET)使用字符串池/实习.解释器意识到"hello"与"hello"相同,因此它优化并使用内存中的相同位置.

另一个好东西:"hell" + "o" is "hello"==>True

  • 甚至C/C++通常也会这样做; "foo"=="foo"在C中经常是真的.在C和Python中,这是一个实现细节; 我不认为Python*中的任何内容都要求解释器执行此操作,并且在C/C++中,这是一个并非所有编译器都可以执行的优化,并且可以禁用它.(相比之下,这个属性在Lua中总是*true;所有字符串都是实例.) (24认同)
  • @Glenn,你是对的,我很高兴有人提到.当然没有人应该依赖这是真的. (2认同)

bob*_*nce 60

因此,每个Python字符串在内存中只有一个位置?

不,只有解释器决定进行优化,这是基于不属于语言规范的策略的决定,并且可能在不同的CPython版本中发生变化.

例如.在我的安装(2.6.2 Linux):

>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False
Run Code Online (Sandbox Code Playgroud)

对于ints同样如此:

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False
Run Code Online (Sandbox Code Playgroud)

所以不要依赖'string'是'string':即使只是看C实现也不安全.

  • 因此,您应该始终使用`==`进行字符串相等比较. (13认同)

Qua*_*ion 13

文字字符串可能基于它们的哈希或类似的东西进行分组.两个相同的文字字符串将存储在同一个内存中,任何引用都会引用它.

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------
Run Code Online (Sandbox Code Playgroud)

  • 正如鲍勃指出的那样,这并不一定总是如此. (3认同)
  • 这正是接受的答案所说的...... (2认同)

Sin*_*ion 6

is运营商如果两个参数是相同的对象返回true.你的结果就是这个和引用的结果.

在字符串文字的情况下,这些是实习的,这意味着它们与已知的字符串进行比较.如果已知相同的字符串,则文字将获取该值,而不是替代值.因此,它们成为同一个对象,表达式是真实的.

  • @endolith:有问题的对象是实习字符串,而不是分配给该字符串的变量.在python中,没有办法修改字符串. (3认同)