if not myList 和 if myList is [] in Python 之间有什么区别?

What's the difference between if not myList and if myList is [] in Python?

当我 运行 遇到一个小问题时,我正在编写一些代码。我最初有这样的东西:

if myList is []:
    # do things if list is empty
else:
    # do other things if list is not empty

当我 运行 程序(并且让 myList 为空)时,程序会直接转到 else 语句,这让我很惊讶。但是,在查看 this question 之后,我将代码更改为:

if not myList:
    # do things if list is empty
else:
    # do other things if list is not empty

这使我的程序按预期工作(它是 运行 'if not myList' 部分而不是 'else' 语句)。

我的问题是这个 if 语句的逻辑发生了什么变化?我的调试器(我使用 Pycharm)说 myList 两次都是空列表。

is 比较对象的 id,因此 a is b == (id(a) == id(b))。这意味着这两个对象相同:它们不仅具有相同的值,而且它们占用相同的内存区域。

>>> myList = []
>>> myList is []
False
>>> id([]), id(myList)
(130639084, 125463820)
>>> id([]), id(myList)
(130639244, 125463820)

可以看到,[]每次都有不同的ID,因为每次都会分配一块新的内存

在Python is 比较身份(同一对象)。较小的数字在启动时被缓存,因此在这种情况下它们 return True 例如

>>> a = 1
>>> b = 1
>>> a is b
True

None是单例。当您执行 [] 时,您正在创建一个新的列表对象。一般来说,您应该只将 is 用于 None 或检查标记值的明确性时。您会在使用 _sentinel = object() 作为标记值的库中看到该模式。