我的Google-fu让我失望了

在Python中,以下两个相等测试是否等效?

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

这是否适用于对象,你将比较实例(一个列表说)?

这就回答了我的问题

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

所以==测试值测试是看他们是否相同的对象?


当前回答

https://docs.python.org/library/stdtypes.html#comparisons

是身份测试 ==测试是否相等

每一个(小的)整数值都被映射到一个单独的值,所以每3都是相同的。这是一个实现细节,但不是语言规范的一部分

其他回答

==确定值是否相等,而is确定它们是否完全相同的对象。

https://docs.python.org/library/stdtypes.html#comparisons

是身份测试 ==测试是否相等

每一个(小的)整数值都被映射到一个单独的值,所以每3都是相同的。这是一个实现细节,但不是语言规范的一部分

他们中的大多数人已经回答到点子上了。只是作为一个额外的说明(基于我的理解和实验,但不是来自文档来源),声明

如果变量引用的对象相等,则==

从以上答案应读为

如果变量引用的对象相等且属于相同类型/类的对象==

. 我根据下面的测试得出了这个结论:

list1 = [1,2,3,4]
tuple1 = (1,2,3,4)

print(list1)
print(tuple1)
print(id(list1))
print(id(tuple1))

print(list1 == tuple1)
print(list1 is tuple1)

这里,列表和元组的内容是相同的,但类型/类是不同的。

你的答案是正确的。is操作符比较两个对象的标识符。==操作符比较两个对象的值。

对象的标识一旦创建就不会改变;你可以把它看作是对象在内存中的地址。

你可以通过定义__cmp__方法或像__eq__这样的富比较方法来控制对象值的比较行为。

它们完全不同。Is检查对象的同一性,而==检查相等性(这一概念取决于两个操作数的类型)。

这只是一个幸运的巧合,“is”似乎正确地适用于小整数(例如5 == 4+1)。这是因为CPython通过使整数为单例来优化范围(-5到256)内的整数的存储。这种行为完全依赖于实现,并且不能保证在所有形式的小型转换操作下都能保留。

例如,Python 3.5也创建了短字符串单例,但将它们切片会破坏这种行为:

>>> "foo" + "bar" == "foobar"
True
>>> "foo" + "bar" is "foobar"
True
>>> "foo"[:] + "bar" == "foobar"
True
>>> "foo"[:] + "bar" is "foobar"
False