Python: & = оператор

Когда я пытаюсь или/или два набора, используя &= и |=, я получил некоторый странный результат.

s1 = {1,2,3}
s2 = {2,3,4}
tmp = s1
tmp &= s2 

Как и ожидалось, tmp будет {2,3}, но я не знаю, почему s1 также изменил его значение на {2,3}.

Однако, если я это сделаю:

tmp = tmp & s2

Тогда s1 не изменится! Может ли кто-нибудь объяснить мне, что происходит под оператором &=?

Ответ 1

&= (set.__iadd__) для 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;
}

Ответ 2

Скопировать набор по значению вместо refrerence

tmp = set(s1)

(As s1 является экземпляром set)

Ответ 3

Он называется intersection_update. return set s сохранение только элементов, также найденных в t. Как вы видите на этой картинке;

enter image description here

Вы перестраиваете первый набор с пересечением.