当我试着用&=
和|=
算符计算或/和两个集合时,我得到了一些奇怪的结果.
s1 = {1,2,3}
s2 = {2,3,4}
tmp = s1
tmp &= s2
正如预期的那样,tmp将是{2,3},但我不知道为什么s1
也将其值更改为{2,3}.
然而,如果我这样做:
tmp = tmp & s2
然后,s1
将保持不变!有人能解释一下&=
接线员下面发生了什么吗?
当我试着用&=
和|=
算符计算或/和两个集合时,我得到了一些奇怪的结果.
s1 = {1,2,3}
s2 = {2,3,4}
tmp = s1
tmp &= s2
正如预期的那样,tmp将是{2,3},但我不知道为什么s1
也将其值更改为{2,3}.
然而,如果我这样做:
tmp = tmp & s2
然后,s1
将保持不变!有人能解释一下&=
接线员下面发生了什么吗?
set
的&=
(set.__iadd__
)与&
(set.__add
)的实现方式不同.
set &= ...
是使用set.intersection_update
实现的,set.intersection_update
更新了设置.
相关CPython代码(Object/setobject.c
):
set_iand(PySetObject *so, PyObject *other)
{
PyObject *result;
if (!PyAnySet_Check(other))
Py_RETURN_NOTIMPLEMENTED;
result = set_intersection_update(so, other); // <----
if (result == NULL)
return NULL;
Py_DECREF(result);
Py_INCREF(so);
return (PyObject *)so;
}