Python None与is关键字的比较

时间:2020-03-27 20:34:29

标签: python python-3.x comparison nonetype pep8

因此,is关键字仅在两个参数指向同一对象时才返回true。我的问题与下面的代码段有关。

此代码段

number = None
if number is None:
    print("PEP 8 Style Guide prefers this pattern")

输出

>>PEP 8 Style Guide prefers this pattern

这是否意味着当我分配number = None时它仅是通过引用,因为is会检查它是否是同一对象。我很困惑为什么会这样?我错了吗??为什么要做出这种设计选择?

2 个答案:

答案 0 :(得分:3)

这是由于两个原因。

1。 Python中的分配仅供参考。

在以下代码中

x = object()
y = x
print(x is y)  # True
print(id(x))  # 139957673835552
print(id(y))  # 139957673835552

调用object()在内存中创建一个新结构,可以使用id()函数访问其唯一标识符。 您可以想象xy是指向同一对象的箭头,这就是为什么两种情况下它们的基础标识符都相同的原因。

这样,当将None分配给变量时,您只是在说“ number是别名,指向返回的对象的箭头,其写为{{ 1}}”。您可以检查

None

将给您两次相同的标识符。可是等等!如果您对number = None print(id(None), id(number)) 这样的大数字进行操作怎么办?

100000

这意味着两次写入的相同文字可以返回不同的对象,从而提出下一个原因。

2。无的语言保证

请注意,无论您获得number = 100000 print(id(100000), id(number)) # Different values! 标识符的次数是多少,都将得到相同的标识符。

None

这是因为编写print(id(None)) # 139957682420224 print(id(None)) # 139957682420224 print(id(None)) # 139957682420224 不会像第一个示例那样创建新对象,因为语言规范guarantees内存中只有None个可能的对象。换句话说,通过写入NoneType 仅返回一个可能的对象,并与None进行比较可以按预期进行。这是一个不错的设计选择:仅有一个规范方法可以说变量(箭头)指向虚无

实际上,鼓励使用is作为检查变量是否为is的Python方法。

您还可以通过编写获取对象的 class

None

并注意如何

NoneType = type(None)

是真的。

注意:出于性能原因,其他文字(尤其是较小的数字)也满足了uniqueness属性。

答案 1 :(得分:2)

所有分配均通过引用(请参见Facts and myths about Python names and values)。但是,该语言保证None是其类型的唯一对象。该值是在启动时创建的,并且文字None始终产生对该值的引用。

>>> a = None;  b = None
>>> a is b
True
>>> a = None
>>> b = None
>>> a is b
True

与类似12345的文字比较,该文字可能会或不会产生对类型为int的现有值的引用。

>>> a = 12345; b = 12345
>>> a is b
True
>>> a = 12345
>>> b = 12345
>>> a is b
False

为什么产生不同的结果并不是很重要,除了说实现可以根据需要从int文字中创建新对象之外。