【发布时间】:2014-10-29 23:35:22
【问题描述】:
我今天对字符串比较感到困惑:似乎 python 重用了字符串(这是一个明智的做法,因为它们是不可变的)。为了检查这个事实,我做了以下事情:
>>> a = 'xxx'
>>> b = 'xxx'
>>> a == b
True
>>> a is b
True
>>> id(a)
140141339783816
>>> id(b)
140141339783816
>>> c = 'x' * 3
>>> id(c)
140141339783816
>>> d = ''.join(['x', 'x', 'x'])
>>> id(d)
140141339704576
这有点令人惊讶。一些问题:
- python 定义新字符串时是否检查其字符串表的全部内容?
- 字符串大小有限制吗?
- 这种机制是如何工作的(比较字符串的哈希值?)
- 不过,它似乎并不适用于所有类型的生成字符串。这里的规则是什么?
【问题讨论】:
-
is测试身份,即内存位置。==测试相等性。互换使用它们是不明智的,因为一些字符串、整数等以优化的名义被实习 -
谢谢,但我已经知道了(我没有问过任何事情)。我的问题不是关于
is与==:而是关于python 如何在内部重用字符串。即关于python使用的内部实现来决定一个字符串不需要添加到它的字符串表中,但它可以被重用。正如您在我的示例中看到的那样,该机制不适用于所有相等的字符串,因此我想了解何时以及如何使用它。 -
@inspectorG4dget:这正是我想要的,谢谢!请添加该答案,我接受。
-
@jeckyll2hide 我认为您想要的答案实际上是在linked dupe... Python 会将符合有效语法的字符串文字作为标识符或单个字符作为优化的一部分。
a = '$a'; b = '$b'; a is b将是False例如
标签: python string python-internals