Python操作符测试可变对象的引用相等性是否可靠?

2024-09-27 09:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道Python中的is运算符在不可变对象(如整数和字符串)上有意外行为。见"is" operator behaves unexpectedly with integers

>>> a = 0
>>> b = 0
>>> a is b
True        # Unexpected, we assigned b independently from a

当涉及到可变对象时,我们是否可以保证预期(如代码中所述)引用两个不同对象(值相等)的两个变量不会在内部绑定到同一个对象?(在我们对这两个变量中的一个进行变异之前,引用当然会有所不同。)

>>> a = [0]
>>> b = [0]
>>> a is b
# Is False guaranteed ?

换句话说,如果某处x is y返回Truexy是可变对象),我们是否保证突变x也会突变y


Tags: 对象integers字符串trueiswith运算符整数
1条回答
网友
1楼 · 发布于 2024-09-27 09:29:33

只要你认为一些“是”的行为是“意外的”,你的心理模型就不符合现实;-)

你的问题是关于Python何时保证创建一个新对象。而当它没有。对于可变对象,是的,生成可变对象的构造函数(包括文本)总是创建一个新对象。这就是为什么:

>>> a = [0]
>>> b = [0]
>>> a is b

总是False。Python可以说,[0]的每个实例是否创建一个新对象是未定义的,但它没有:它保证每个实例始终创建一个新对象is行为是其结果,而不是驱动因素

同样地

>>> a = set()
>>> b = set()
>>> a is b
False

这也是有保证的。因为set()返回一个可变对象,所以它总是保证创建一个新的这样的对象

但对于不可变对象,它是未定义的。例如,未定义此操作的结果:

>>> a = frozenset()
>>> b = frozenset()
>>> a is b

frozenset()与整数文本类似,返回一个不可变的对象,是返回新对象还是重用现有对象取决于实现。在这个特定的示例中,a is bTrue,因为当前的实现正好重用空的frozenset。但是,例如,碰巧

>>> a = frozenset([3])
>>> b = frozenset([3])
>>> a is b
False

今天。它也可以在明天返回True(尽管这不太可能——虽然空的frozenset是一种很容易检测到的特殊情况,但要确保所有frozenset对象的唯一性,代价会很高)

相关问题 更多 >

    热门问题