2015-02-08 115 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一个实例)