时我很惊讶
[] is not []
评估为True
。
此代码中发生了什么?真正的not
和is
语句在做什么?
答案 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
x
和y
实际上是两个不同的列表,因此如果您向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
运算符用于可变类型。