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]()
Вы перестраиваете первый набор с пересечением.