2015-02-08 203 views
11

當我嘗試使用&=|=運算符或/和兩組運算符時,我得到了一些奇怪的結果。Python:&=運算符

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

正如預期的那樣,TMP將是{2,3},但我不知道爲什麼s1也改變了它的價值爲{2,3}。

但是,如果我這樣做:

tmp = tmp & s2 

然後,s1將保持不變!任何人都可以爲我解釋&=運算符下會發生什麼?

+1

您應該複製'的價值s1'而不是參考 – SomethingSomething 2015-02-08 15:13:45

回答

11

&= (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

我一直在尋找.. – Maroun 2015-02-08 15:16:30

+0

哇,這是一個好點!感謝所有答案。 – Bent 2015-02-08 15:23:14

+0

@Bent,不客氣。 – falsetru 2015-02-08 15:24:48

1

它叫做intersection_update返回集只保留t中的元素。正如你在這幅圖中看到的那樣;

enter image description here

要重新建設第一套具有交集。

3

複製通過值而不是通過refrerence

tmp = set(s1) 

設置(如s1set一個實例)