Listeler, Optimizasyon ve İç İçe Listeler

16-1.47.30

Python’da köşeli parantez, [], kullandığımızda ne zaman bir liste oluştursak her zaman yeni bir liste yaratılmaktadır.

Örneğin:

>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> z = [1, 2, 3]

>>> id(x)
133419689170176
>>> id(y)
133419689185280
>>> id(z)
133419689172672

Burada aynı içerikte listeler yaratsak bile listelerin kendileri farklıdır. Listeler değiştirilebilir tür olduğu için Python implmenetasyonu burada bir optimizasyon yapmaya çalışmamaktadır. Fakat değiştirilemez tür olan int gibi türlerde durum genelde böyle değildir.

>>> x = 5
>>> y = 5
>>> z = 5

>>> id(x)
133419699798384
>>> id(y)
133419699798384
>>> id(z)
133419699798384

Aşağıdaki örneğe bir bakalım. Burada y in her elemanı aynı xi gösterir durumdadır.

>>> x = [1,2]
>>> y = [x, x, x]

>>> id(y[0])
133419689172672
>>> id(y[1])
133419689172672
>>> id(y[2])
133419689172672

>>> y
[[1, 2], [1, 2], [1, 2]]

>>> x[0] = 100

>>> y
[[100, 2], [100, 2], [100, 2]]

Fakat aşağıdaki örnekte böyle değildir.

>>> y = [[1,2], [1,2], [1,2]]

>>> id(y[0])
133419689170176
>>> id(y[1])
133419689170368
>>> id(y[2])
133419689011904

İpucu

Özetle her [] gördüğümüzde yeni bir list nesnesi oluşturuluyor gibi düşünebiliriz.


Şimdi de şu örneğe bakalım:

>>> x = []
>>> y = [x, x, x]

>>> y
[[], [], []]

>>> id(y[0])
133419689171648
>>> id(y[1])
133419689171648
>>> id(y[2])
133419689171648

>>> x.append(10)

>>> y
[[10], [10], [10]]

>>> x.append(20)

>>> y
[[10, 20], [10, 20], [10, 20]]

Burada y nin elemanları aynı listeyi yani xi göstermektedir. İlk başta x boş bir listedir. Biz xe append() metodu ile bir eleman eklediğimizde y nin tüm elemanları aynı xi gösterdiği için örnekteki gibi bir durum oluşur.


Peki x = [[]] * 3 durumunu düşünelim. Çarpma işlemi aynı şeyi eklemekti. O yüzden her eleman yine aynı listeyi gösteriyor.

>>> x = [[]] * 3

>>> id(x[0])
133419669508480
>>> id(x[1])
133419669508480
>>> id(x[2])
133419669508480

>>> x = [[], [], []]  # Hepsi ayrı liste

>>> id(x[0])
133419689185280
>>> id(x[1])
133419669796480
>>> id(x[2])
133419669338688

16-2.16.45

💭 Yorumlar

Yorum altyapısı giscus tarafından (evet tarafından!) sağlanmaktadır. Yorum yazabilmek için GitHub hesabınız üzerinden giriş yapmanız gerekmektedir. Yorumlar, Github Discussions üzerinde saklanmaktadır.

e36bf509-dee9-4030-8cd6-f7c0e6e1cb68