“is”内置运算符对 中的元素显示奇怪的行为np.ndarray。
尽管 rhs 和 lhs 的 id 相同,但“is”运算符返回 False(此行为特定于np.ndarray)。
a = np.array([1.,])
b = a.view()
print(id(a[0] == id(b[0]))) # True
print(a[0] is b[0]) # False
这种奇怪的行为甚至在没有视图副本的情况下也会发生。
a = np.array([1.,])
print(a[0] is a[0]) # False
有谁知道这种奇怪行为的机制(可能还有证据或规范)?
Post Script:请重新思考这两个例子。
如果这是一个列表,则不会观察到这种现象。
a = [0., 1., 2.,]
b = []
b.append(a[0])
print(a[0] is b[0]) # True
a[0] 和 b[0] 指的是完全相同的对象。
a = np.array([1.,])
b = a.view()
b[0] = 0.
print(a[0]) # 0.0
print(id(a[0]) == id(b[0])) # True
注意:这个问题可能是重复的,但我仍然有点困惑。
a = np.array([1.,])
b = a.view()
x = a[0]
y = b[0]
print(id(a[0])) # 139746064667728
print(id(b[0])) # 139746064667728
print(id(a[0]) == id(b[0])) # True
print(id(a[0]) == id(x)) # False
print(id(x) == id(y)) # False
a[0] 是一个时间对象吗?
时态对象的 id 是否被重用?
这不与规范相矛盾吗?( https://docs.python.org/3.7/reference/expressions.html#is )
6.10.3. Identity comparisons
The operators is and is not test for object identity: x is y is true if and only if x and y are the same object. Object identity is determined using the id() function. x is not y yields the inverse truth value.
如果 id 被重新用于临时对象,为什么在这种情况下 id 是不同的?
>>> id(100000000000000000 + 1) == id(100000000000000001)
True
>>> id(100000000000000000 + 1) == id(100000000000000000)
False
梵蒂冈之花
一只甜甜圈
相关分类