Python字符串引用

5

可能是重复问题:
Python中'=='和'is'比较字符串时,为什么'is'有时会失败?

嗨,我有一个关于Python在何时以及如何使用引用的问题。

我这里有一个例子,我能够理解它。

a = "cat"
b = a
a is b
   True

这很有道理。但是这里出现了我不理解的东西。
a = "cat"
b = "cat"
a is b
   True
c = 1.2
d = 1.2
c is d
    False
e = "cat"
f = "".join(a)
e is f
    False

为什么 a is b 返回 True 而不是 c is d?这两种类型都是不可变的,对吧?使用浮点数时可以正常工作。我想这可能是一种优化方式,但我很乐意接受任何答案。
我还尝试了其他一些东西,并得到了以下结果:
a = "cat"
b = "c"
c = b+"at"
a is c
    False # Why not same as setting c = "cat"
d = "cat"+""
a is d
    True # Probably same as setting d = "cat"
e = "c"+"at"
a is e
    True # Probably same as setting e = "cat"

我猜这里是同样的问题,但为什么使用变量b创建“cat”时没有返回True呢?
我使用的是Python 2.5,如果有任何不同之处,请指出。
欢迎提供任何有用的提示和想法。

Python 2.6,并且在第二个示例中c is d返回True。 - Maxim Sloyko
1个回答

7
a = "cat"
b = "cat"
a is b
   True
c = 1.2
d = 1.2
c is d
    False

为什么a is b返回True而不是c is d
嗯,正确的问题应该是“为什么c is d返回False而不是a is b?”因为逻辑上预期的行为应该是返回False-它们是在不同的地方创建的独立对象。
事实上,当前使用C编写的Python实现,即CPython,使用字符串和小整数缓存作为优化手段。这种优化背后的逻辑是,既然它们无论如何都是不可变的,那就不应该有影响。但是不应该依赖于这种行为,因为它是特定于实现的而不是语言的一部分。始终使用==比较字符串,而不是is==也针对不可变内置类型进行了优化,它首先检查身份,只有在它们不是同一个对象时才进行相等性测试。因此,在性能方面不应该有影响。
看起来你已经找到了关于CPython不能依赖它的原因,在你的其他问题中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接