是Python中的运算符

时间:2012-01-18 02:37:45

标签: python python-3.x

  

可能重复:
  Python “is” operator behaves unexpectedly with integers
  How is the 'is' keyword implemented in Python?

我对python中的“is”运算符有疑问:

>>> a = "1234"
>>> b = "1234"
>>> a is b
True
>>> a = "12 34"
>>> b = "12 34"
>>> a is b
False

任何人都可以解释为什么会这样吗?另外我无法理解,据说“是”运算符只需要比较对象的内存地址,那么表达式“a是b”是真的吗?

3 个答案:

答案 0 :(得分:3)

is不是等于运算符。它检查两个变量是否引用同一个对象。如果你这样做:

a = "12 34'
b = a

然后a is b将是True,因为它们引用相同的对象。

您提出的案例归因于Python解释器的实现细节。由于字符串是不可变的,在某些情况下,创建两个相同的字符串将产生对同一对象的引用 - 即,在第一种情况下,Python解释器仅创建"1234"的单个副本,并{{1 }和a都引用该对象。在第二种情况下,解释器创建两个副本。这是由于解释器创建和处理字符串的方式,并且,作为实现细节,不应该依赖它。

答案 1 :(得分:1)

来自docs

  

运算符isis not测试对象标识:当{且仅当x和y是同一个对象时,x is y为真。 x is not y产生反向真值。

id函数显示了不同之处:

>>> a = "1234"
>>> b = "1234"
>>> a is b
True
>>> id(a)
140340938833512
>>> id(b)
140340938833512

>>> a = "12 34"
>>> b = "12 34"
>>> a is b
False
>>> id(a)
140340938833568
>>> id(b)
140340938833624

答案 2 :(得分:1)

is运算符用于识别两个对象何时相同 - 即:在内部,它们存储在相同的内存位置。

Python实现可以自由地优化不可变对象 - 例如字符串,整数和其他数字,这样当一个实例化相同的对象时,就会重新使用先前存在的对象。例如,在cPython(标准实现)中," n"第一个整数(我不记得实际的阈值)总是作为单个实例保存在内存中,所以"是"永远是"真的"对于小整数。

当然,is运算符不是意味着以这种方式使用。人们不应该关心字符串或整数是否在内部缓存(尽管甚至还有一个内置函数 - intern - 暗示解释器以这种方式缓存字符串或对象)。

使用is的想法是验证一个对象实际上是否与另一个对象相同。要始终如一地验证对象是否相等,应该始终使用等于运算符==