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()
函数访问。
你可以想象 x
和 y
是指向同一个对象的箭头,这就是为什么它们的底层标识符在这两种情况下是相同的。
因此,当将 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
是真的。
注意:出于性能原因,其他字面量(尤其是小数字)也满足唯一性 属性。
因此 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()
函数访问。
你可以想象 x
和 y
是指向同一个对象的箭头,这就是为什么它们的底层标识符在这两种情况下是相同的。
因此,当将 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
.
也可以通过写
得到对象的classNoneType = type(None)
并注意如何
NoneType() is None
是真的。
注意:出于性能原因,其他字面量(尤其是小数字)也满足唯一性 属性。