Python字符串引用

时间:2011-01-13 11:02:41

标签: python string reference immutability

  

可能重复:
  Python '==' vs 'is' comparing strings, 'is' fails sometimes, why?

您好。我有一个关于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是b 返回True而不是 c是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,如果这会产生任何差异

此处提供的任何提示和想法都表示赞赏。

1 个答案:

答案 0 :(得分: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”,因为逻辑预期的行为是返回{ {1}} - 它们是在不同的地方创建的独立对象。

事实上,用C编写的python的当前实现Cpython使用字符串和小型int缓存作为优化手段。优化背后的逻辑是,因为它们无论如何都是不可变的,所以它无关紧要。但是你不应该依赖于那种行为,因为它是特定于实现的而不是语言的一部分。始终使用False来比较字符串,而不是==is还对不可变内置类型进行了优化,它首先检查身份,并且只有当它们不是同一个对象时,才进行相等性测试。因此,性能方面无关紧要。

看起来你已经找到了为什么你不能依赖Cpython本身,在你的其余问题上。