我已经搜索了网络和堆栈溢出问题,但无法找到这个问题的答案。我所做的观察是,在 Python 2.7.3 中,如果您为两个变量分配相同的单个字符串,例如
>>> a = 'a'
>>> b = 'a'
>>> c = ' '
>>> d = ' '
然后变量将共享相同的引用:
>>> a is b
True
>>> c is d
True
对于一些较长的字符串也是如此:
>>> a = 'abc'
>>> b = 'abc'
>>> a is b
True
>>> ' ' is ' '
True
>>> ' ' * 1 is ' ' * 1
True
但是,在很多情况下(出乎意料地)没有共享引用:
>>> a = 'a c'
>>> b = 'a c'
>>> a is b
False
>>> c = ' '
>>> d = ' '
>>> c is d
False
>>> ' ' * 2 is ' ' * 2
False
有人可以解释一下原因吗?
我怀疑解释器和/或某些缓存机制可能会进行简化/替换,这些缓存机制利用 python 字符串在某些特殊情况下是不可变的这一事实进行优化,但我知道什么?我尝试使用 str 构造函数和 copy.deepcopy 函数制作字符串的深层副本,但字符串仍然不一致地共享引用。
我遇到问题的原因是因为我在一些单元测试中检查对字符串的引用是否不相等,我正在为新型 python 类的克隆方法编写。