Python“是”声明:发生了什么?

时间:2010-09-15 14:18:56

标签: python

时我很惊讶
[] is not []

评估为True

此代码中发生了什么?真正的notis语句在做什么?

7 个答案:

答案 0 :(得分:57)

a is not b是一个特殊的运算符,相当于not a is b

如果a和b绑定到同一个对象,则运算符a is b返回True,否则返回False。当您创建两个空列表时,您会得到两个不同的对象,因此is返回False(因此is not返回True)。

答案 1 :(得分:32)

is是身份比较。

==是平等比较。

您的声明正在制作两个不同的列表,并检查它们是否是同一个实例,而不是它们。如果您使用==,它将返回true,因为它们都是空列表。

答案 2 :(得分:22)

描述为什么会发生这种情况的最佳方式是:

这是你的例子

>>> x = []
>>> y = []
>>> print(x is y)
... False

xy实际上是两个不同的列表,因此如果您向x添加内容,它就不会显示在y

>>> x.append(1)
>>> print(x)
... [1]
>>> print(y)
... []

那么我们如何使(x is y)评估为真呢?

>>> x = []
>>> y = x
>>> print(x is y)
... True

>>> x.append(10)

>>> print(x)
... [10]
>>> print(y)
... [10]

>>> print(x is y)
... True

如果你想查看两个列表是否具有相同的内容......

>>> x = []
>>> y = []
>>> print(x == y)
... True

>>> x.append(21)

>>> print(x)
... [21]
>>> print(y)
... []

>>> print(x == y)
... False

>>> y = [21]
>>> print(x == y)
... True

答案 3 :(得分:8)

is表示是同一个实例。如果运算符两侧的变量指向同一个对象,则计算结果为true,否则为false。

Reference,靠近底部。

答案 4 :(得分:3)

是对身份的检查。 [][]是两个不同(但相当于)的列表。如果要检查两个列表是否都为空,则可以使用它们的真值(对于空字符串,集合和零,为false)。

if not ([] and []):
   print 'Spanish Inquisition'

is保证返回True的唯一时间是单身,例如None。就像Highlander一样,你的程序中只能有一个None实例 - 每次你返回None时,如果你输入print None,那就是没有提到的那个“事物”。

除了空列表之外,

[],OTOH不能保证是任何东西,并且在布尔上下文中计算为False。

答案 5 :(得分:2)

我知道我发帖到一个很老的帖子。然而,这可能有助于有人像我一样偶然发现这一点。

"是"检查,记忆地址是否相同,而" =="检查值是否相同。从以下示例中可以清楚地看出

让我们先谈谈不可变对象,因为它易于理解

# could be any immutable object
immutable_a = 10
immutable_b = 10

# prints address of a and b variable
print "address of a is %s" % id(immutable_a)
print "address of a is %s" % id(immutable_b)

# as both addresses is same, following shall be true
print immutable_a is immutable_b

# as the values are also same, following shall be true as well
print immutable_a == immutable_b

现在让我们谈谈可变对象

# could be any mutable object
mutable_a = [10]
mutable_b = [10]

# prints address of a and b variable
print "address of mutable_a is %s" % id(mutable_a)
print "address of mutable_b is %s" % id(mutable_b)

# as addresses are not same, following shall be false
print mutable_a is mutable_b

# as the values are same, following shall be true
print mutable_a == mutable_b

答案 6 :(得分:0)

@Jiaaro是对的。将is与不可变数据类型一起使用是危险的,因为由于Pythons解释器优化而无法预测。

见这个例子:

10 * "a" is 10 * "a"    # True
100 * "a" is 100 * "a"  # False

在第二行中,使用解释器的新id创建一个新对象会更快。因此,仅将is运算符用于可变类型。