Hen*_*nke 5 python string reference immutability
你好.我有一个关于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,如果这会产生任何差异
任何有用的提示和想法都表示赞赏.
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本身,在你的问题的其余部分.