2015-02-08 14 views
11

Khi tôi cố gắng hoặc/và hai bộ sử dụng toán tử &=|=, tôi nhận được một số kết quả lạ.Python: & = toán tử

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

Như dự kiến, tmp sẽ là {2,3}, nhưng tôi không biết tại sao s1 cũng thay đổi giá trị thành {2,3}.

Tuy nhiên, nếu tôi làm:

tmp = tmp & s2 

Sau đó, s1 sẽ không thay đổi! Bất cứ ai có thể giải thích cho tôi những gì xảy ra bên dưới nhà điều hành &=?

+1

Bạn nên copy 's1' bởi giá trị và không bằng cách tham khảo – SomethingSomething

Trả lời

11

&= (set.__iadd__) cho set được thực hiện khác nhau với & (set.__add).

set &= ... được triển khai bằng cách sử dụng set.intersection_update cập nhật bộ tại chỗ.


mã có liên quan 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

gì tôi đang tìm kiếm .. – Maroun

+0

Wow, đó là một điểm tốt! Cảm ơn tất cả các câu trả lời. – Bent

+0

@Bent, Bạn được chào đón. – falsetru

1

Nó được gọi là intersection_update. bộ trả về các phần tử duy nhất cũng được tìm thấy trong t. Như bạn thấy trong hình này;

enter image description here

Bạn đang xây dựng lại bộ đầu tiên với giao lộ.

3

Sao chép thiết lập bởi giá trị thay vì bằng refrerence

tmp = set(s1) 

(Như s1 là một thể hiện của set)

Các vấn đề liên quan