2015-02-08 15 views
11

Quando provo a/o due set utilizzando l'operatore &= e |=, ho ottenuto alcuni risultati strani.Python: & = operatore

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

Come previsto, tmp sarà {2,3}, ma io non so perché s1 anche cambiato il rapporto qualità a {2,3}.

Tuttavia, se faccio:

tmp = tmp & s2 

Poi, s1 sarà invariato! Qualcuno può spiegare per me cosa succede sotto l'operatore &=?

+1

è necessario copiare 's1' per valore e non per riferimento – SomethingSomething

risposta

11

&= (set.__iadd__) per set diversa implementazione con & (set.__add).

set &= ... viene implementato utilizzando set.intersection_update che aggiorna il set sul posto.


relativo codice 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

Quello che cercavo .. – Maroun

+0

Wow, questo è un buon punto! Grazie per tutte le risposte. – Bent

+0

@Bent, prego. – falsetru

1

Si chiama intersection_update. set di reso s mantenendo solo gli elementi trovati anche in t. Come vedi in questa immagine;

enter image description here

si sono ri-costruzione primo set con intersezione.

3

copia del set per valore invece che da refrerence

tmp = set(s1) 

(Come s1 è un'istanza di set)