【问题标题】:Python strings references [duplicate]Python字符串引用[重复]
【发布时间】:2011-06-08 10:29:15
【问题描述】:

可能重复:
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 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。

标签: python string reference immutability


【解决方案1】:
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,使用字符串和小 int 缓存作为优化手段。该优化背后的逻辑是,因为它们无论如何都是不可变的,所以这无关紧要。但是您不应依赖该行为,因为它是特定于实现的,而不是语言的一部分。始终使用== 来比较字符串,而不是is== 还对不可变的内置类型进行了优化,它首先检查身份,并且只有当它们不是同一个对象时,才会继续进行相等性测试。因此,性能方面应该无关紧要。

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

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2019-11-16
    • 2021-07-21
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多