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.

1
Biganon 15 sierpień 2014, 03:08

2 odpowiedzi

Najlepsza odpowiedź

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!

4
Dietrich Epp 14 sierpień 2014, 23:30

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.

0
user123 14 sierpień 2014, 23:28