Dzieje się z Python 2.7.8. Nie dzieje się z 3.4.1.
Przykład:
>>> id(id)
140117478913736
>>> id(id)
140117478913736
>>> id(id)
140117478913736
>>> id(id(id))
38775176
>>> id(id(id))
38775176
>>> id(id(id))
38775176
>>> id(id(id(id)))
38775152
>>> id(id(id(id)))
38775224
>>> id(id(id(id)))
38775176
... itd. Ostatnia linia zawsze zwróci te trzy wartości, zapętle nad nimi.
5 "ID": zawsze ta sama wartość.
6 "ID": pętle na trzy wartości.
2 odpowiedzi
Wynik id()
jest to taki sam dla czasu trwania obiektu, w którym przejdziesz.
Tak, id(id)
wytworzy ten sam wynik, o ile argument, istnieje argument, {x1}}. Co jest na zawsze.
Jednak id(id(id))
wytworzy tylko ten sam wynik, o ile istnieje wynik id(id)
, ale ten obiekt jest tylko tymczasowy. Może przypadkowo powrócić do tego samego wyniku wiele razy, ale nie możesz polegać na tym zachowaniu. Mogę pokazać:
>>> id(id(id))
12345
>>> id(id(id))
12345 # coincidence!
>>> [1, 2, 3]
[1, 2, 3]
>>> id(id(id))
98765 # now it's different!
Więc, na co szukasz, to tylko zbieżności w wzorcach alokacji w implementacji Pythona.
Dlaczego pętla trzech?
W twoim pytonie chyba to się dzieje. Po lewej jest wyrażenie oceniane, po prawej stronie jest sterta.
id(id(id)) [ ]
id(140117478913736) [ 140117478913736 ] # evaluate
38775176 [ 140117478913736, 38775176 ] # evaluate
[ _ , 38775176 ] # decref
id(id(id)) [ _ , 38775176 ]
id(140117478913736) [ 140117478913736, 38775176 ] # evaluate
Możesz zobaczyć za pomocą id(id(id))
, z każdym obiektem biorącym pierwszą szczelinę w sterty, ponieważ {x1}} zawsze trafia do tego samego gniazda, zawsze masz ten sam rezultat ... chyba że coś przydzielasz!
id(id)
musi być stała w pojedynczej instancji wykonania, ponieważ id
nie jest obiektem tymczasowym.
Wszelkie inne wyrażenie z ciągiem zagnieżdżonego {X0}} Połączenia nie jest naprawdę wymagane, aby mieć spójne wyniki, ponieważ próbujesz uzyskać id
pewnego całkowitego z całe życie, które kończy się po ocenie całej ekspresji , a id
ma być adresem pamięci obiektu jako wspomina o dokumentacji. Jest to jednak szczegółowo wdrożenie, więc nie powinieneś na to liczyć. Ten szczegół jest jednak powodem, dla którego otrzymujesz te wyniki.
Fakt, że nie dzieje się w Pythonie 3.4.1, po prostu mówi, że alokacja pamięci i wzorce dotycząca zapadania tych dynamicznych obiektów są różne. To nieważne. Informacje tak naprawdę nie pomagają w żaden sposób.
Liczy się, że id
gwarantuje identyfikator unikalny dla wszystkich obiektów aktywnych wcielenia. Szczegóły dotyczące tego, co oznacza to identyfikator, są nieistotne dla programatora.
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.