Liste ve Demet Farkı

Merhaba.Udemyden aldığım kursta eğitmen listelerin değiştirilebilir ve demetlerin değiştirilemez olduğunu söylüyor.Şöyle bir örnek var

liste=[1,2,3]
liste[1]=10
liste

demet=(1,2,3)
demet[1]=10
demet

Neden listeler değişirken demet değişmiyor.Yardımcı olursanız sevinirim.

Merhaba.

Tasarımları gereği. Benzerliklerinin yanı sıra ikisinin de farklı işlevleri ve avantajları var. Kursa devam ederseniz bunlar hakkında bilgi edinirsiniz muhtemelen. Bu dokümandan da faydalanabilirsiniz. Öğrenmek istediğiniz daha spesifik bir şey varsa onu sormalısınız.

2 Beğeni

list performans açısından tupledan geride kalıyor. Çok basit bir kullanım şekliyle anlatmaya çalışayım bildiğim kadarıyla.
Mesela bir oyun yaptınız ve oyuncunun envanterini bir yerde tutmanız gerekiyor. Envantere sürekli yeni eşyalar eklenebilir ve silinebilir. bu yüzden mutable bir veri tipine ihtiyacınız var. Bu durumda list kullanmanız mantıklı olabilir.
Diğer örnek ise şöyle, yine bu yaptığınız oyunda haftanın günlerine ihtiyaç duydunuz. haftanın 7 günü vardır ve bu günler değişmez. bu durumda bir demetin içine bu günleri sabit olarak tanımlayıp o demet içerisinden günlere erişebilirsiniz. soruda bahsedilmemiş fakat son örnek için set kullanmak daha mantıklı. setlerin içindeki veriler unique verilerdir, setin içinde aynı veriden birden fazla bulunamaz, bu da günler için daha iyi bir kullanım.

Değiştirilebilir veriler (değişken/variable) ve değişmeyen veriler (sabit/Constant) işletim sisteminden talep edilen belleğin farklı bölgelerinde tutulur.

Hem belleğin adreslenmesi hemde bellekte kapladığı yer bakımından tasarruf sağlamak ki bu tasarruf hem adreslere zıplama (jump) zamanı hem de bellekte tutma şekli açısında kapasite anlamında tasarruf sağlar.

Bu nedenle program boyunca değeri değişmeyen veriler, bellek ve performansa olumlu katkı sağlamak amacıyla farklı bir metot ve farklı bir yerde saklanarak ekonomi sağlanmaya çalışılır.

mutable immutable olma durumlarına bu yönten bakmanızda fayda var. Bu konuda uzunca bir makale bile yazılır aslında.

1 Beğeni

Bu bahsettiğiniz yöntemlerin Python veya tuple veri tipi ile doğrudan bir alakası yok:

1 Beğeni

Size göre alakası yok.

Bellek yönetimini hangi katmanda ararsanız arayın son katmanda işletim sistemi katmanında hangisinin kullanılacağı belirliyor.

Yorumlanan bir dilde sizin verdiğiniz linkin alakası yok.

Bellek yönetimini yapan katmana talimatı hangi dil kurallarıyla veriyorsunuz dolaylamaları takip ederseniz alaka kurabilirsiniz.

Bu durumda sizin verdiğiniz link bu işin yapıldığı yorumlayıcı katman cython zaten.

Yorumlanan bir dilin standalone kendi belleğini yöneterek çalıştığını düşünmediniz herhalde?

Bana gore de alakasi yok.

Linke gore de, isletim sistemime gore de. (Bu arada link yorumlanan bir dil hakkinda)

11:23:16 0 aib@apollon:/tmp% gdb python3
Reading symbols from python3...
(No debugging symbols found in python3)
(gdb) r
Starting program: /usr/bin/python3 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = tuple(range(20))
>>> x
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
>>> id(x)
140737343733248
>>> 
Program received signal SIGINT, Interrupt.
0x00007ffff7d553ad in __GI___select (nfds=1, readfds=0x7fffffffcca0, writefds=0x0, exceptfds=0x0, timeout=0x0) at ../sysdeps/unix/sysv/linux/select.c:69
69	../sysdeps/unix/sysv/linux/select.c: No such file or directory.
(gdb) x/16gx 140737343733248
0x7ffff7613e00:	0x0000000000000001	0x0000555555ac5ba0
0x7ffff7613e10:	0x0000000000000014	0x00007ffff75a00d0
0x7ffff7613e20:	0x00007ffff75a00f0	0x00007ffff75a0110
0x7ffff7613e30:	0x00007ffff75a0130	0x00007ffff75a0150
0x7ffff7613e40:	0x00007ffff75a0170	0x00007ffff75a0190
0x7ffff7613e50:	0x00007ffff75a01b0	0x00007ffff75a01d0
0x7ffff7613e60:	0x00007ffff75a01f0	0x00007ffff75a0210
0x7ffff7613e70:	0x00007ffff75a0230	0x00007ffff75a0250
(gdb) x/8wx 0x00007ffff75a0190
0x7ffff75a0190:	0x0000001f	0x00000000	0x55ac9320	0x00005555
0x7ffff75a01a0:	0x00000001	0x00000000	0x00000006	0x00000000
(gdb) info proc mappings 
process 2231342
Mapped address spaces:

          Start Addr           End Addr       Size     Offset  Perms  objfile
      0x555555554000     0x5555555c1000    0x6d000        0x0  r--p   /usr/bin/python3.10
[...]
      0x7ffff7318000     0x7ffff769f000   0x387000        0x0  rw-p   
[...]
(gdb) set {int} 0x7ffff75a01a8 = 42
(gdb) x/8wx 0x00007ffff75a0190
0x7ffff75a0190:	0x0000001f	0x00000000	0x55ac9320	0x00005555
0x7ffff75a01a0:	0x00000001	0x00000000	0x0000002a	0x00000000
(gdb) c
Continuing.
x
(0, 1, 2, 3, 4, 5, 42, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
>>> 

Gunumuz dillerinin cogu kendi bellegini yonetiyor. Standalone olarak degil (ki o yonde de egilimler var; kw: unikernel) ama isletim sisteminden sadece arada bir hafiza blogu isteyerek.

1 Beğeni

Nasıl protected modda, bir işletim sisteminin fiziksel bellek yönetiminin dil tarafından yönetildiğini düşünüyorsunuz?

Evet o hafıza bloğunu isteyerek kendi içinde yönetiyor.

Saplar samanlar çok karşıacak.

İşletim sistemi linux, windows da olabilir mi?

Yürütülebilir dosyaya işletim sistemlerinin bakış açısı farklı olabilir mi?

Yani basitçe interpreter belleği nasıl yönetiyor?

Yani yorumlayıcının sabit ve değişkenlere aynı muameleyi yapması kendisinin bu şekide çalıştığı anlamına gelmiyor.

Saplar samanlar karışmadan.

İtiraz ediyorum hakim bey demek yerine.

Listelerin değiştirilebilir, demetlerin değiştirilemez tanımanmasının farklı bilimsel açıklamasını kendi görüşlerinizle belirtmek isteyebilirsiniz.

İstemezseniz dünyanın geri kalanı, değişkenleri ve sabitleri diller neden kullanır amacı nedir genellemesi ile devam etmeliyiz.