Python字符串引用

Hen*_*nke 5 python string reference immutability

可能重复:
Python'=='vs'是'比较字符串','有时'失败,为什么?

你好.我有一个关于Python何时以及何时使用引用的工作方式的问题.

我在这里有一个例子,我理解.

a = "cat"
b = a
a is b
   True
Run Code Online (Sandbox Code Playgroud)

这是有道理的.但这里有一些我不明白的东西.

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
Run Code Online (Sandbox Code Playgroud)

为什么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"
Run Code Online (Sandbox Code Playgroud)

我想这是同样的问题,但是为什么当变量b用于创建"cat" 时它不会给出True ?

我使用python 2.5,如果这会产生任何差异

任何有用的提示和想法都表示赞赏.

nos*_*klo 7

a = "cat"
b = "cat"
a is b
   True
c = 1.2
d = 1.2
c is d
    False
Run Code Online (Sandbox Code Playgroud)

为什么a is b回归True而不是c is d

那么,正确的问题是" 为什么会c is d返回False而不是a is b "因为逻辑预期的行为将是返回False- 它们是在不同的地方创建的独立对象.

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

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