Python:&=运算符

OhM*_*osh 17 python set python-2.7 python-3.x

当我尝试使用&=和/和两个使用和|=运算符时,我得到了一些奇怪的结果.

s1 = {1,2,3}
s2 = {2,3,4}
tmp = s1
tmp &= s2 
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,tmp将是{2,3},但我不知道为什么s1还将其值改为{2,3}.

但是,如果我这样做:

tmp = tmp & s2
Run Code Online (Sandbox Code Playgroud)

然后,s1将保持不变!谁能解释一下&=运营商下面会发生什么?

fal*_*tru 12

&=(set.__iadd__) for set以不同的方式实现&(set.__add).

set &= ...实现使用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;
}
Run Code Online (Sandbox Code Playgroud)


GLH*_*LHF 6

叫做intersection_updatereturn set s仅保留在t中也找到的元素。如您在这张图片中看到的;

在此处输入图片说明

您正在重新构建具有交集的第一个集合。