Loading [MathJax]/jax/output/HTML-CSS/jax.js
Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
3 beğenilme 0 beğenilmeme
637 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  | 637 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=bubizimliste 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,296 soru
21,840 cevap
73,541 yorum
2,723,919 kullanıcı