因此,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
会检查它是否是同一对象。我很困惑为什么会这样?我错了吗??为什么要做出这种设计选择?
答案 0 :(得分:3)
这是由于两个原因。
在以下代码中
x = object()
y = x
print(x is y) # True
print(id(x)) # 139957673835552
print(id(y)) # 139957673835552
调用object()
在内存中创建一个新结构,可以使用id()
函数访问其唯一标识符。
您可以想象x
和y
是指向同一对象的箭头,这就是为什么两种情况下它们的基础标识符都相同的原因。
这样,当将None
分配给变量时,您只是在说“ number
是别名,指向由返回的对象的箭头,其写为{{ 1}}”。您可以检查
None
将给您两次相同的标识符。可是等等!如果您对number = None
print(id(None), id(number))
这样的大数字进行操作怎么办?
100000
这意味着两次写入的相同文字可以返回不同的对象,从而提出下一个原因。
请注意,无论您获得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
文字中创建新对象之外。