为什么 id(1) 是 id(1) 返回 False?
why is id(1) is id(1) returning False?
我知道is
运算符比较的是两者的id,而不是value
但是,当您评估 id(1) 和 id(1) 时,对象(它是一个 int)彼此相等。
那么为什么返回 false?
id(1) # 27533656
id(1) is id(1) # False
type(id(1)) # int
那么,从技术上讲,将其推导为
id(1) is id(1)
27533656 is 27533656 # has to be True!
is
检查对象 identity 而 ==
检查对象 equality。差异可能很细微,但在处理列表等可变对象时最容易看出:
x = [1, 2, 3]
y = x[:] # copy, not the same list
x is y # False
x == y # True
如果我向 x
添加内容,y
将看不到它:
x.append(4)
x == y # now False since they have diverged.
但是,如果我为 x
添加别名并附加到它,别名也会看到更改:
z = x # alias `z` to `x`
x.append(5)
x == z # True
而之所以这样是因为z
是x
.
z is x # True
在这种情况下,1
的 id
是一致的,因为 CPython1 缓存小整数以提高效率(因此对象文字 1
始终是同一个对象——因此也是同一个 Id)。但是,id
的 return 值实际上可以是具有等效值的 int
的不同实例。
1这是众所周知的 CPython 实现细节。其他实现(和未来版本)的行为不同,因此不要依赖此行为。
您稍微误解了 is
语法的作用。
你用那段代码做的大致是:
id(id(1)) == id(id(1))
因为id
函数返回的值不是静态的,不能保证是同一个身份,它们很可能是不同的身份。
作为证明,当我将它们放入打印语句中时,我得到:
print id(id(1)) # 4327028
print id(id(1)) # 4326968
明显不一样
如果您将代码更改为:
if 1 is 1: # basically in this case id(1) == id(1)
print "success"
你会发现这些值确实是同一个id。
如评论中所述。 x is x
和 id(x) == id(x)
确定等价性的方法对于所有文字类型并不总是相同的。
在这个问题的特定情况下,它们可能被视为相等。
我知道is
运算符比较的是两者的id,而不是value
但是,当您评估 id(1) 和 id(1) 时,对象(它是一个 int)彼此相等。
那么为什么返回 false?
id(1) # 27533656
id(1) is id(1) # False
type(id(1)) # int
那么,从技术上讲,将其推导为
id(1) is id(1)
27533656 is 27533656 # has to be True!
is
检查对象 identity 而 ==
检查对象 equality。差异可能很细微,但在处理列表等可变对象时最容易看出:
x = [1, 2, 3]
y = x[:] # copy, not the same list
x is y # False
x == y # True
如果我向 x
添加内容,y
将看不到它:
x.append(4)
x == y # now False since they have diverged.
但是,如果我为 x
添加别名并附加到它,别名也会看到更改:
z = x # alias `z` to `x`
x.append(5)
x == z # True
而之所以这样是因为z
是x
.
z is x # True
在这种情况下,1
的 id
是一致的,因为 CPython1 缓存小整数以提高效率(因此对象文字 1
始终是同一个对象——因此也是同一个 Id)。但是,id
的 return 值实际上可以是具有等效值的 int
的不同实例。
1这是众所周知的 CPython 实现细节。其他实现(和未来版本)的行为不同,因此不要依赖此行为。
您稍微误解了 is
语法的作用。
你用那段代码做的大致是:
id(id(1)) == id(id(1))
因为id
函数返回的值不是静态的,不能保证是同一个身份,它们很可能是不同的身份。
作为证明,当我将它们放入打印语句中时,我得到:
print id(id(1)) # 4327028
print id(id(1)) # 4326968
明显不一样
如果您将代码更改为:
if 1 is 1: # basically in this case id(1) == id(1)
print "success"
你会发现这些值确实是同一个id。
如评论中所述。 x is x
和 id(x) == id(x)
确定等价性的方法对于所有文字类型并不总是相同的。
在这个问题的特定情况下,它们可能被视为相等。