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ı x
değ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
tam olarak ne bekliyorsunuz? '' print b' '' '' '' yazdı '' '' '' 'b' = 2' – Deusdeorum
ç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 –
@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