@marzappo: to co pokazałeś jest trochę bardziej złożone i nie odnosi się tylko do adresowania pamięci. Rozważmy taki przykład:
koziolek@koziolek-desktop3 ~/workspace/python $ python3
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> id("geek")
140235900763696
>>> quit()
koziolek@koziolek-desktop3 ~/workspace/python $ python3
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> id("geek")
140537457438256
>>>
Dwa uruchomienia interpretera ten sam rezultat. Pytanie, jaka jest szansa, że obiekt trafi dokładnie w ten sam adres w pamięci jeżeli mam 128GB RAM?Funkcja id
w pythonie ma działanie podobne do hashCode
w Javie. Nawet ma podobne założenie, że jest nieunikalnym, niezmiennym identyfikatorem dla obiektu. Dla uproszczenia implementacji jeżeli obiekt jest trzymany jako struktura gdzieś niżej w C, to id
zwróci adres tego obiektu. Jest to odpowiednik kodu w Javie:
koziolek@koziolek-desktop3 ~/workspace/python $ jshell
| Welcome to JShell -- Version 11.0.13
| For an introduction type: /help intro
jshell> System.out.println(new Integer(123).hashCode());
123
jshell> /exit
| Goodbye
koziolek@koziolek-desktop3 ~/workspace/python $ jshell
| Welcome to JShell -- Version 11.0.13
| For an introduction type: /help intro
jshell> System.out.println(new Integer(123).hashCode());
123
Kolejna sprawa to pule obiektów. W celu ograniczenia zużycia pamięci można utworzyć pulę dla różnych obiektów. W Javie taka pula jest tworzona na starcie dla liczb całkowitych z zakresu od -128 do 127, co odpowiada zakresowi short
i jest „good enough” w większości zastosowań. Można to zmienić za pomocą flagi -Djava.lang.Integer.IntegerCache.high=<MAX>
. Drugą pulą jest pula dla String
, która ma własną przestrzeń w pamięci i będzie wypełniana w czasie działania aplikacji.
W Pythonie masz coś takiego jak Small Integer Caching dla liczb z przedziału do -5 do 256. Nie ma za to przestrzeni dla puli typu String
. Przy czym stringi są niezmienne więc efektywnie implementacja musi wspierać jakieś rozwiązanie pulo-podobne.