当我试着用&=|=算符计算或/和两个集合时,我得到了一些奇怪的结果.

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

正如预期的那样,tmp将是{2,3},但我不知道为什么s1也将其值更改为{2,3}.

然而,如果我这样做:

tmp = tmp & s2

然后,s1将保持不变!有人能解释一下&=接线员下面发生了什么吗?

推荐答案

set&= (set.__iadd__)& (set.__add)的实现方式不同.

set &= ...是使用set.intersection_update实现的,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;
}

Python-3.x相关问答推荐

如何获得大Pandas 的常见时间间隔

按小时和日期对Pandas 数据帧进行分组

我用Kivy创建的应用程序在安卓系统上运行时出错.(attributeerror:';class';对象没有属性';_javaclass__cls_storage';)

如何将函数映射到所有命名元组的元素?

如何提高 snowpark 程序的性能?

将水平堆叠的数据排列成垂直

如何在 20 秒后重复使用 Pillow 在现有图像上创建新图像?

正则表达式来识别用 Python 写成单词的数字?

为什么 Multiprocessing 的 Lock 不会阻止其他进程使用对象?

排队多个子进程

使用带有多线程的 win32com

Python - 使用 OpenCV 将字节图像转换为 NumPy 数组

python tkInter 浏览文件夹按钮

获取嵌套字典的所有键

作为函数对象属性的 __kwdefaults__ 有什么用?

ImportError:无法在 PyQt5 中导入名称QStringList

plt.cm.get_cmap 中可以使用哪些名称?

带有自定义标头的 urllib.urlretrieve

如何创建一个永远在其上运行滚动协程的事件循环?

Django Rest 框架 ListField 和 DictField