1

在 Python 中,表达式(a is b) == ( id(a) == id(b) )似乎总是返回 True,其中ab是引用某个对象的变量,因为该id函数返回存储它们的内存并is用于对象标识。

有什么例外吗?

4

2 回答 2

3
(a is b) == ( id(a) == id(b) )

这个表达式总是True。有两种可能的方式: 1. 两者都a引用b同一个对象

>>>a='Hello'
>>>b=a
>>> a is b
True
>>> id(a)==id(b)
True
  1. 'a' 和 'b' 都指代不同的对象。
>>>a='hello'
>>>b='world'
>>>a is b
False
>>>id(a)==id(b)
False

id(a)==id(b)做什么a is b

现在, Incase1(a is b) == ( id(a) == id(b) )这是True==True返回True. 在第二种情况下,(a is b) == ( id(a) == id(b) )这是False==False返回True

文档

对象身份的运算符is和测试:当且仅当xy是同一个对象时, x 是 y为真。使用该函数确定对象的身份。x is not y产生逆真值。is notid()

于 2020-03-28T12:42:02.613 回答
1

如果您is仅用于比较None,我相信您应该这样做,那么这个问题是无关紧要的,因为None有一个明确定义的地址

>>> id(None)
10306432
>>> id(None)
10306432
>>> a = None
>>> id(a)
10306432

我还没有遇到过a is b产生与 不同的结果的情况id(a) == id(b),但是您仍然不想is粗心使用:

>>> a = 1
>>> b = 1
>>> id(a), id(b), id(1)
(10914496, 10914496, 10914496)

# 1 has a single address, is fails to recognize that a and b were created separately.

>>> a = 500
>>> b = 500
>>> id(a), id(b), id(500)
(140251806972464, 140251806973200, 140251806973744)

# Unlike the previous case, 500 is created multiple times, each with a different address

>>> a, b = 500, 500
>>> id(a), id(b), id(500)
(140251806972336, 140251806972336, 140251806972464)

# Several instances during the same initialization are created with a single address

>>> a, b = 500, 5*100
>>> id(a), id(b), id(500)
(140251806973104, 140251806973200, 140251806971280)

# However it only works if all are created in the same manner...

>>> a, b = 5*100, 5*100
>>> id(a), id(b), id(500)
(140251806971920, 140251806973392, 140251806973104)

# ... and they have to be created explicitely.


>>> a = 500 ; b = 500
>>> id(a), id(b), id(500)
(140251806973104, 140251806973104, 140251806972464)

# Separating with a semicolon does not change this fact...

>>> 500 is 500
True
>>> a is b
True
>>> a = 500
>>> a is 500
False
>>> a = 500 ; a is 500
True

# However being in the same line is not a basis for always having the same address, even if all values were created explicitly :

>>> any([a is 500 for a in [500]])
False

其他对象每个都有自己的不稳定行为:

>>> a = 'hello'
>>> b = 'hello'
>>> id(a), id(b), id('hello')
(140251789045408, 140251789045408, 140251789045408)

>>> a = 'hello' + ' '
>>> b = 'hello' + ' '
>>> id(a), id(b), id('hello' + ' ')
(140251789044344, 140251789012472, 140251789012920)

>>> a = []
>>> b = []
>>> id(a), id(b), id([])
(140251789066632, 140251789069704, 140251789174216)

我会得出结论,is和的行为id太不可靠了,即使它是真的也没有(a is b) == (id(a) == id(b))用,至少在不可变对象的情况下是这样。

我个人永远不会想到is在任何情况下使用

if x is None:
    pass

id只保留可变对象或自定义类。

于 2020-03-28T13:32:51.513 回答