Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
3 beğenilme 0 beğenilmeme
481 kez görüntülendi

Python'da, diğer çoğu programlama dilinin mantığına sığmayacak bir durum var. Şu koda bakalım:

x=[3,5,2,8,1]
y=x
x[4]=-2
print(y)

Bu kod parçası, şu çıktıyı veriyor:

[3,5,2,8,-2]

Başka çoğu programlama dili, x değişince y'yi değiştirmez. Bunun sebebi nedir, python'un nesi farklı?

Veri Bilimi kategorisinde (236 puan) tarafından  | 481 kez görüntülendi

2 Cevaplar

3 beğenilme 0 beğenilmeme
Python'da bir liste yaratma süreci şöyle işliyor. İstenilen özellikte data, hafızada oluşturuluyor, daha sonra $x$ değişkeni, hafızadaki bu datanın referans numarasına bir ok olarak tanımlanıyor. Sanki bir kutu, kutunun üzerinde bir adres (mesela PK312321), kutunun içinde de, bizim liste. $x = bu_bizim_liste$ demek, $x$ için Pk312321'e git demek.

$ y= x$ ataması ile $y$ değişkenini oluşturduğunuz zaman, aslında, az önceki referans numarasında saklanan bilgiye giden bir ok yaratmış oluyorsunuz. Yani, Pk312321'ya git. Bu yüzden de, $y$'de değişiklik yapmak, adresi verilen kutuya gidip, kutudakini değiştirmek demek. Sonra $x$'e senden naber diyince, mecburen adrese gidiyor, orada ne buluyor ise, onu getiriyor.
(3.7k puan) tarafından 
tarafından düzenlendi
2 beğenilme 0 beğenilmeme

Öncelikle:

http://matkafasi.com/127395/pythonda-degismez-immutable-degisir-mutable-tipler-nelerdir

Python'un veri modelinde immutable (değiştirilemez) ve mutable (değiştirilebilir) tiplerin kullanımları farklı çalışıyor. [3,5,2,8,1] bir liste ve listeler mutable (değiştirilebilir). Bu yüzden  x=[3,5,2,8,1] deklerasyonunu bize hafızada sırasıyla 3, 5, 2, 8, 1 sayılarına işaret eden bir x nesnesi oluşturuyor. Bir sonraki adımda y=x deklerasyonu ise x'e eşit bir y nesnesi oluşturuyor. Bu yüzden daha sonra x'te yaptığımız değişikliklerden y de etkileniyor. 

Aynısını immutable (değiştirilemez) olan nesneler yapsaydık o zaman x'te yapılan değişikliklerden y etkilenmezdi çünkü değiştirilemez bir nesnede yapılan değişiklikler aslında yeni bir nesne oluşturur. Mesela aşağıdaki kodla a değişkenin id'sini takip edersek değiştiğini görürüz.

a = 1
print(id(a))
a += 2
print(id(a))

Önce hafızada bir değiştirilemez olan 1 sayısına işaret eden bir a değişkeni oluşturduk. Sonra a'ya 2 ekledik, bunu yaparken hafızada 1'i değiştiremeyeceğimiz (çünkü immutable) için biz de a'yı değiştirdik artık 3 işaret etmeye başladı. Bu yüzden id'si de değişti artık a bambaşka bir nesne.

Deklerasyonlardaki bu farkı aynı işlemlerin mutable/immutable nesnelerde uygulandığında aşağıdaki örnekte görebiliriz.

## Immutable (değiştirilebilir) nesnelerle
x = [1, 2, 3]
y = x
x += [4, 5]
print(y)

# [1,2,3,4,5]

## Mutable (değiştirilemez) nesnelerle

x = (1, 2, 3)
y = x
x += (4, 5)
print(y)

# (1,2,3)

 

 

(1.8k puan) tarafından 
20,210 soru
21,736 cevap
73,302 yorum
1,909,818 kullanıcı