當我嘗試使用&=
和|=
運算符或/和兩組運算符時,我得到了一些奇怪的結果。Python:&=運算符
s1 = {1,2,3}
s2 = {2,3,4}
tmp = s1
tmp &= s2
正如預期的那樣,TMP將是{2,3},但我不知道爲什麼s1
也改變了它的價值爲{2,3}。
但是,如果我這樣做:
tmp = tmp & s2
然後,s1
將保持不變!任何人都可以爲我解釋&=
運算符下會發生什麼?
當我嘗試使用&=
和|=
運算符或/和兩組運算符時,我得到了一些奇怪的結果。Python:&=運算符
s1 = {1,2,3}
s2 = {2,3,4}
tmp = s1
tmp &= s2
正如預期的那樣,TMP將是{2,3},但我不知道爲什麼s1
也改變了它的價值爲{2,3}。
但是,如果我這樣做:
tmp = tmp & s2
然後,s1
將保持不變!任何人都可以爲我解釋&=
運算符下會發生什麼?
&=
(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;
}
它叫做intersection_update
。 返回集只保留t中的元素。正如你在這幅圖中看到的那樣;
要重新建設第一套具有交集。
複製通過值而不是通過refrerence
tmp = set(s1)
設置(如s1
是set
一個實例)
您應該複製'的價值s1'而不是參考 – SomethingSomething 2015-02-08 15:13:45