2016-04-16 18 views
5

Bu ayar işlemi neden s olarak ayarlandı? BuPython "& =" kümesi operatörü neden "& =" tamsayı işleminden farklı davranıyor?

Seti Operasyonu &= (s değiştirir) .... aynı operatörün tamsayı (bitsel) versiyonu için aynı şekilde çalışmaz:

s = set('abc') 
t = set('bcd') 
u=s 
print u, s, t 
u &= t 
print u, s, t 

sonuçları:

set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd']) 

set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd']) 

Bitsel işlem &= (s değiştirmez):

Sonuç:

7 7 3 

3 7 3 
+7

Takımlar değişebilir ve tamsayılar değildir. Bir 'frozenset' ile deneyin. – jonrsharpe

+0

Frozensets ile beklendiği gibi çalışır. Bu nedenle, işlem, set u'yu (ifadenin başlangıcındaki s ile aynı nesne) yerinde değiştirmeye çalışmaz veya bir istisna oluşturmuş olur. Ne yapmaya çalışıyor? –

+0

Listeler aynı takımla ilgili setleri gösterir for & =. Tupllar bir TypeError'a sebep olur. –

cevap

5

Tamsayılar o yapmazdım (sadece iç durumunu değiştirerek daha değişken x yerine yeniden atar sen x &= y kullandığınızda yüzden x = x & y şekilde genişletilir & operasyonu değil &= operasyonu uygulamak & için, + için bir anlam ifade etmeyeceği gibi, bir değeri değiştirmek için çok anlamlı. Frozensets için aynı.

&= numaralı işlemi uygular, değişken yeniden atanmaya genişletilmez, bunun yerine operatörün sol tarafını değiştirir.

Tuples, ne & ne de &='u uygular, böylece bir hata anlamlıdır. Bununla birlikte, += ile aynı etkiyi elde edersiniz: += için tupl'ler genişletilir, çünkü listeler yerinde olabilir, çünkü listeler değişebilir.

Herhangi bir sınıf, bu işleçlerin kendi sürümlerini uygulayabilir. Detaylar için bakınız here. Özellikle &, __and__ ve &= ila __iand__ arasındadır.

Eğer bunun hakkında düşünürseniz, yerinde değişkenleri doğrudan değişime izin vermek için değiştirilebilen sınıfları uygulamak için değişken sınıflar için mantıklı bir kuraldır.

+0

Teşekkürler. Bana "Augmented Assignment", PEP-203'ü ve cevabımı, https://docs.python.org/2/reference/simple_stmts.html adresindeki Python 2.7.11 belgesinde bulmam için yeterli bilgi verdiniz. –

İlgili konular