Python'da pek bu şekilde çalışmıyor. Python, referansları nesnelere aktarır. İşlevinizin içinde bir nesne var - Bu nesneyi değiştirmekte özgürsünüz (mümkünse). Ancak tamsayılar değişmezdir . Çözümlerden biri, tamsayıyı mutasyona uğratılabilen bir kapta geçirmektir:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Bu en iyi ihtimalle çirkin / beceriksizdir, ancak Python'da daha iyisini yapamazsınız. Bunun nedeni, Python'da, assignment ( =
) sağ tarafın sonucu olan nesneyi alır ve onu sol taraftaki * her şeye bağlar (veya onu uygun işleve geçirir).
Bunu anladığımızda, bir fonksiyonun içindeki değişmez bir nesnenin değerini değiştirmenin neden bir yolu olmadığını görebiliriz - onun niteliklerinden hiçbirini değiştiremezsiniz çünkü değişmezdir ve sadece "değişken" e yeni bir atayamazsınız. değer çünkü o zaman aslında (eskisinden farklı olan) yeni bir nesne oluşturuyorsunuz ve ona eski nesnenin yerel ad alanında sahip olduğu adı veriyorsunuz.
Genellikle geçici çözüm, istediğiniz nesneyi döndürmektir :
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* Yukarıdaki ilk örnek durumda, 3
aslında geçilir x.__setitem__
.