在交互式python shell中试试这个。
[] is [ ]
以上返回False,为什么?
答案 0 :(得分:14)
您创建了两个可变对象,然后使用is
查看这些是否是相同对象。那应该肯定会返回False
,否则就会被打破。
你不会希望is
在这里返回true。想象一下,如果你这样做:
foo = []
bar = []
foo.append(42)
如果bar
现在包含42
,您会感到非常惊讶。如果is
返回true,表示两个[]
调用都返回完全相同的对象,则foo
的引用中会显示追加bar
。
对于 immutable 对象,缓存对象是有意义的,此时is
可能返回true,就像空元组一样:
>>> () is () # are these two things the same object?
True
CPython实现优化了空元组创建;你将始终获得完全相同的对象,因为这样可以节省内存并使某些操作更快。因为元组是不可变的,所以这是完全安全的。
如果您希望测试值相等,那么您的操作符错误。请改用==
运算符:
>>> [] == [] # do these two objects have the same value?
True
答案 1 :(得分:1)
在python is
中,reference equality check
类似[]和[]它们是不同的对象,您可以通过
print id([]),id([])
或
In [1]: id([])
Out[1]: 140464629086976
In [2]: id([])
Out[2]: 140464628521656
两者都会返回不同的地址,两者都是不同的对象所以总是会给出错误的
[] is []
<强>输出强>
false
答案 2 :(得分:0)
[]
与list()
类似,如果你这样做:
a = list()
b = list()
显然a
和b
是两个完全不同的对象,因此:
a is b # False
像
list() is list() # False
像
[] is [] # False
答案 3 :(得分:0)
==
运算符比较两个操作数的值并检查值是否相等。而is
运算符检查两个操作数是否都引用相同的对象。
id('') : 139634828889200
id('') : 139634828889200
id('') : 139634828889200
id([]) : 139634689473416
id([]) : 139634689054536
id([]) : 139634742570824