Python None 与is关键字比较

Python None comparison with is keyword

因此 is 关键字 returns 只有当两个参数指向同一个对象时才为真。我的问题与下面的代码片段有关。

这个片段

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

产出

>>PEP 8 Style Guide prefers this pattern

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

所有作业均通过引用(参见 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 文字,如果愿意的话。

这是因为两个原因。

1。 Python 中的赋值是引用。

在下面的代码中

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

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

因此,当将 None 分配给变量时,您只是在说“number 是一个别名,一个指向 对象 return 的箭头编辑者 写作 None”。你可以检查

number = None
print(id(None), id(number))

会给你相同的标识符两次。可是等等!如果你为 100000 这样的大数字做这件事怎么办?

number = 100000
print(id(100000), id(number))  # Different values!

这意味着相同的文字,写两次,可以return不同的对象,引出下一个原因。

2。 None

的语言保证

请注意,无论您获得多少次 None 标识符,您得到的都是同一个。

print(id(None))  # 139957682420224
print(id(None))  # 139957682420224
print(id(None))  # 139957682420224

这是因为写 None 不会像第一个例子那样创建一个新对象,因为语言规范 guarantees 中只有一个可能的 NoneType 对象记忆。换句话说,只有一个可能的对象 return 通过编写 None 编辑,与 is 的比较按预期工作。这是一个很好的设计选择:只有一个规范的方式来表示变量(一个箭头)指向虚无.

事实上,鼓励使用 is 作为检查变量 None.

的 Pythonic 方法

也可以通过写

得到对象的class
NoneType = type(None)

并注意如何

NoneType() is None

是真的。

注意:出于性能原因,其他字面量(尤其是小数字)也满足唯一性 属性。