2016-03-30 23 views
2

Pythonic takasının her zaman çalışmadığını fark ettim.pythonic swap x, y = y, x çalışmıyor?

def swap(x,y): 
    x,y = y,x 

a = 1 
b = 2 
swap(a,b) 

print b 

sonucu: 2

Neden pythonic yolu bu durumda işe değişkenleri takas geliyor? Geçici bir değişkeye ihtiyacım var mı?

+1

tam olarak ne bekliyorsunuz? '' print b' '' '' '' yazdı '' '' '' 'b' = 2' – Deusdeorum

+2

çoğu python nesneleri değiştirilemez ... ergo aslında takas değilsiniz ... sadece işlev içinde bir yerel x, y değişkeni yaratıyorsunuz 'x = y, y = x', ancak sadece –

+1

@JoranBeasley yönteminin kapsamı içindeyken bu doğrudur, bu mutabiliteyle ilgisi yoktur. Bu işlev için listelerde geçmiş olsaydınız davranış aynı olurdu. – timgeb

cevap

1

Hiçbir zaman sonuçları döndürmediniz ve atamadınız. Aksi takdirde, Joran'ın söylediği gibi, sadece fonksiyonda yerel değişkenler yaratıyorsunuz. Örnek: Aşağıda

def swap(a, b): 
    print "swap called" 
    return (b,a) 

a = 1 
b = 2 

print a,b 
a,b = swap(a,b) 
print a,b 

Sonuçlar gösterilir:

 
1 2 
swap called 
2 1 
+1

Diğer bir deyişle, python değer-değerdir. –

+0

@JamesBuck no, python geçişi geçiyor. – timgeb

+0

@timgeb, C ve Java'nın olduğu gibi, aynı değere sahiptir. Daha doğru şekilde referans değer olarak tanımlanır. –

3

işlev tanımı

def swap(x,y): 

x ve y ilk satırda çok formal parametrelerinin olarak adlandırılır. Eğer gerçek argümanlar olarak a ve b yılında geçiyoruz

swap(a, b) 

çağırdığınızda. Şimdi ne olacak

Python Eğer fonksiyon gövdesinin x İçinde yer.

geçti fiili bağımsız değişkenler için yeni isimler yaratır şimdi de adı a sahiptir bellekte tamsayı nesnesi için yeni bir isim olmasıdır. y artık bellekte tamsayı nesnesi için yeni bir addır ve bu da b adıyla gider. İşte bu yüzden Python ne çağrı-değer ne de referans olarak adlandırılır, ama en iyi call-by-assignment olarak tanımlanır.

Popüler inanışın aksine, çağrı işlevleri ve atama, değişken ve değişmez parametreler için tam olarak aynı şekilde çalışır. Eğer atamalar Python nasıl çalıştığını anlamak Böylece bir kez

>>> def swap(x,y): 
...  x,y = y,x 
... 
>>> a = [1] 
>>> b = [2] 
>>> swap(a,b) 
>>> a 
[1] 
>>> b 
[2] 

, ayrıca fonksiyon çalışmalarını çağırır nasıl anlamış olacak: Sen değişken değerleri için gözlemlediklerini aynı davranışı göreceksiniz.

bir örnek yapmak için: Eğer bir fonksiyon yazmadım, kodunuz eşdeğer olurdu: Satır 3'te

a = 1 
b = 2 
x = a 
y = b 
x,y = y,x 
del x 
del y 

, ayrıca gider tamsayı nesnesi için yeni bir isim x yaratıyor a ismi ile. 4. satır aynı mantığı takip eder.

5. satırda, (y, x) numaralı tuple, sağ taraftaki (2, 1) değeri ile oluşturuyorsunuz, bu da daha sonra paketten kaldırılıyor, örn.adı xdeğeri 2'ye yeniden ve adı y değeri 1'e yeniden olmasıdır: a ve b değeri için isimler olmak durdu asla

>>> a = 1 
>>> b = 2 
>>> x = a 
>>> y = b 
>>> x,y = y,x 
>>> x 
2 
>>> y 
1 

Burada dikkat edilmesi gereken önemli şey 1 ve 2 sırasıyla:

>>> a 
1 
>>> b 
2 

son iki satır sadece isimleri x ve kapsamını çıkış yaptıktan sonra işlevinde ne eşdeğerdir y salmak.ve b adlarının x ve y öğelerini kapattıktan sonra hala bağlı olduklarını unutmayın.

>>> a 
1 
>>> b 
2