当我尝试使用&=
和|=
运算符或/和两组运算符时,我得到了一些奇怪的结果。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