tae*_*esu 2 python comparison object
我知道is运算符比较了两者的id,而不是值.
但是当你评估id(1)和id(1)时,对象(它是一个int)彼此相等.
那为什么它会返回虚假?
id(1) # 27533656
id(1) is id(1) # False
type(id(1)) # int
Run Code Online (Sandbox Code Playgroud)
所以,从技术上讲,推断它
id(1) is id(1)
27533656 is 27533656 # has to be True!
Run Code Online (Sandbox Code Playgroud)
is检查对象标识,同时==检查对象是否相等.差异可能很微妙,但在处理像列表这样的可变对象时最容易看到:
x = [1, 2, 3]
y = x[:] # copy, not the same list
x is y # False
x == y # True
Run Code Online (Sandbox Code Playgroud)
如果我添加一些东西x,y将不会看到它:
x.append(4)
x == y # now False since they have diverged.
Run Code Online (Sandbox Code Playgroud)
但是,如果我别名x并附加到它,别名也会看到更改:
z = x # alias `z` to `x`
x.append(5)
x == z # True
Run Code Online (Sandbox Code Playgroud)
而这样做的原因是因为z 是 x.
z is x # True
Run Code Online (Sandbox Code Playgroud)
在这种情况下,idof 1是一致的,因为CPython 1缓存小整数以提高效率(因此对象文字1总是相同的对象 - 因此相同的Id).但是,返回值id实际上可以是int具有等效值的不同实例.
1这是CPython的一个众所周知的实现细节.其他实现(和未来版本)的行为是不同的,所以不要依赖这种行为.
您稍微误解了is语法的作用。
你用那段代码所做的事情大致是:
id(id(1)) == id(id(1))
Run Code Online (Sandbox Code Playgroud)
由于函数返回的值id不是静态的,并且不能保证是相同的标识,因此它们很可能是不同的标识。
作为证据,当我将它们放入打印语句中时,我得到:
print id(id(1)) # 4327028
print id(id(1)) # 4326968
Run Code Online (Sandbox Code Playgroud)
这显然不一样。
如果您要将代码更改为:
if 1 is 1: # basically in this case id(1) == id(1)
print "success"
Run Code Online (Sandbox Code Playgroud)
你会发现这些值确实是相同的id。
正如评论中所指出的。x is x对于所有文字类型,确定等效性的和方法id(x) == id(x)并不总是相同。
在这个问题的具体情况下,他们可以被平等对待。
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |