2015-02-08 24 views
11

&= ve |= operatörünü kullanarak iki seti denediğimde ve/veya iki garip sonuç aldım. Beklendiği gibiPython: & = işleci

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

, tmp {2,3} olacak, ama s1 ayrıca {2,3} için değer neden değiştirdiğini bilmiyorum.

Ancak, ben yaparsam:

tmp = tmp & s2 

Sonra s1 değişmeden olacak! Herkes bana &= operatörünün altında neler olduğunu açıklayabilir mi?

+1

Sen 'değeriyle s1' ve kopya gerektiğini değil aradığım Ne referans – SomethingSomething

cevap

1

intersection_update adı verilir. İade setinin yalnızca numaralı traktta yer alan elemanlara ait olduğunu unutmayın. Bu resimde gördüğünüz gibi;

enter image description here

Sen yeniden düzenle bina birinci kavşak ile ayarlayın. set için

3

kopyalama değeri yerine refrerence

tmp = set(s1) 

göre ayarlayın. Yerinde kümeyi güncelleyen set.intersection_update kullanılarak

set &= ... uygulanır.


İlgili CPython kodu (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; 
} 
İlgili konular