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()
作为标记值的库中看到该模式。
当我 运行 遇到一个小问题时,我正在编写一些代码。我最初有这样的东西:
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()
作为标记值的库中看到该模式。