Przeczytałem dokumentację Python 2 i zauważyłem id()
funkcję:
Zwróć „tożsamość” obiektu. Jest to liczba całkowita (lub długa liczba całkowita), która jest unikalna i stała dla tego obiektu przez cały okres jego istnienia. Dwa obiekty z nienakładającymi się okresami istnienia mogą mieć tę samą wartość id ().
Szczegóły implementacji CPythona: jest to adres obiektu w pamięci.
Tak więc eksperymentowałem, używając id()
listy:
>>> list = [1,2,3]
>>> id(list[0])
31186196
>>> id(list[1])
31907092 // increased by 896
>>> id(list[2])
31907080 // decreased by 12
Jaka jest liczba całkowita zwrócona przez funkcję? Czy jest to synonimem adresów pamięci w C? Jeśli tak, dlaczego liczba całkowita nie odpowiada rozmiarowi typu danych?
Kiedy jest id()
używany w praktyce?
Odpowiedzi:
Twój post zawiera kilka pytań:
Jest to „ liczba całkowita (lub długa liczba całkowita), która na pewno będzie unikalna i stała dla tego obiektu przez cały okres jego życia ” . (Biblioteka standardowa języka Python - funkcje wbudowane) Unikalna liczba. Nic dodać nic ująć. Potraktuj to jako numer ubezpieczenia społecznego lub numer identyfikacyjny pracownika dla obiektów Pythona.
Koncepcyjnie tak, ponieważ obaj mają gwarancję, że będą wyjątkowi w swoim wszechświecie podczas swojego życia. W jednej konkretnej implementacji Pythona jest to adres pamięci odpowiedniego obiektu C.
Ponieważ lista nie jest tablicą, a element listy to odniesienie, a nie obiekt.
Prawie nigdy.
id()
(lub jego odpowiednik) jest używany wis
operatorze.źródło
To jest tożsamość lokalizacji obiektu w pamięci ...
Ten przykład może pomóc ci nieco lepiej zrozumieć koncepcję.
Wszystkie wskazują na to samo miejsce w pamięci, dlatego ich wartości są takie same. W tym przykładzie
1
jest przechowywany tylko raz, a cokolwiek innego wskazuje,1
będzie odnosić się do tej lokalizacji pamięci.źródło
id()
zwraca adres obiektu, do którego się odwołujemy (w CPythonie), ale Twoje zamieszanie wynika z faktu, że listy w Pythonie bardzo różnią się od tablic w C. Na liście w Pythonie każdy element jest odniesieniem . Więc to, co robisz, jest znacznie bardziej podobne do tego kodu w C:Innymi słowy, drukujesz adres z referencji, a nie adres odnoszący się do miejsca, w którym przechowywana jest Twoja lista.
W moim przypadku znalazłem
id()
funkcję przydatną do tworzenia nieprzezroczystych uchwytów, aby powrócić do kodu C podczas wywoływaniapython
z C. Robiąc to, możesz łatwo użyć słownika do wyszukania obiektu z jego uchwytu i gwarantuje, że jest on unikalny.źródło
Odpowiedź Roba (większość głosowała powyżej) jest poprawna. Chciałbym dodać, że w niektórych sytuacjach użycie identyfikatorów jest przydatne, ponieważ pozwala na porównanie obiektów i znalezienie, które obiekty odnoszą się do twoich obiektów.
Ta ostatnia zwykle pomaga na przykład w debugowaniu dziwnych błędów, w których zmienne obiekty są przekazywane jako parametr do wypowiadania klas i są przypisywane do lokalnych zmiennych w klasie. Mutowanie tych obiektów spowoduje mutację vars w klasie. Przejawia się to dziwnym zachowaniem, w którym wiele rzeczy zmienia się w tym samym czasie.
Niedawno miałem ten problem z aplikacją Python / Tkinter, w której edycja tekstu w jednym polu wprowadzania tekstu zmieniała tekst w innym podczas pisania :)
Oto przykład, jak możesz użyć funkcji id () do śledzenia, gdzie znajdują się te odwołania. Z całą pewnością nie jest to rozwiązanie obejmujące wszystkie możliwe przypadki, ale masz pomysł. Ponownie identyfikatory są używane w tle i użytkownik ich nie widzi:
WYNIK:
Podkreślenia w nazwach zmiennych służą do zapobiegania kolizji nazw. Funkcje używają argumentu „skąd”, aby umożliwić im rozpoczęcie wyszukiwania odniesień. Ten argument jest wypełniany przez funkcję, która wyświetla wszystkie nazwy w danej przestrzeni nazw. Globals () jest jedną z takich funkcji.
źródło
Zaczynam od języka Python i używam id, kiedy używam powłoki interaktywnej, aby sprawdzić, czy moje zmienne są przypisane do tego samego elementu, czy po prostu wyglądają tak samo.
Każda wartość to identyfikator, czyli niepowtarzalna liczba związana z miejscem, w którym jest przechowywana w pamięci komputera.
źródło
Jeśli używasz Pythona 3.4.1, otrzymasz inną odpowiedź na swoje pytanie.
zwroty:
Liczby całkowite,
-5
które256
mają stały id, a po znalezieniu go wiele razy jego identyfikator nie zmienia się, w przeciwieństwie do wszystkich innych liczb przed lub po nim, które mają inny identyfikator za każdym razem, gdy go znajdziesz. Liczby od-5
do256
mają id w kolejności rosnącej i różnią się o16
.Liczba zwracana przez
id()
funkcję jest unikalnym identyfikatorem nadawanym każdemu elementowi przechowywanemu w pamięci i jest analogicznie taka sama jak lokalizacja pamięci w C.źródło
Odpowiedź brzmi: prawie nigdy. Identyfikatory są używane głównie wewnętrznie w Pythonie.
Przeciętny programista Pythona prawdopodobnie nigdy nie będzie musiał używać
id()
w swoim kodzie.źródło
id()
całkiem sporo. Dwa przypadki użycia z góry mojej głowy: dyktando tożsamości (ręcznie rozwijane, ad-hoc) i zwyczajrepr()
dla obiektu, w którym tożsamość ma znaczenie, ale wartość domyślnarepr
nie jest odpowiednia.is
Operator wykorzystuje się do sprawdzenia, czy dwa identyczne przedmioty (w przeciwieństwie do równe). Rzeczywista wartość, która jest zwracana,id()
prawie nigdy nie jest używana do niczego, ponieważ tak naprawdę nie ma znaczenia i jest zależna od platformy.źródło
Jest to adres obiektu w pamięci, dokładnie tak, jak mówi doktor. Ma jednak dołączone metadane, właściwości obiektu i lokalizacja w pamięci są potrzebne do przechowywania metadanych. Tak więc, kiedy tworzysz zmienną o nazwie lista, tworzysz także metadane dla listy i jej elementów.
Tak więc, jeśli nie jesteś absolutnym guru w języku, nie możesz określić id następnego elementu listy na podstawie poprzedniego elementu, ponieważ nie wiesz, co język przydziela wraz z elementami.
źródło
id()
. Musiałbyś dokładnie znać odpowiednie menedżery pamięci (liczba mnoga!), Znać ich dokładny stan w pewnym momencie i znać dokładną kolejność, w jakiej obiekty zostały przydzielone. Innymi słowy: nie będzie.Mam pomysł na wykorzystanie wartości
id()
w logowaniu.Jest tani do zdobycia i jest dość krótki.
W moim przypadku używam tornado i
id()
chciałbym mieć kotwicę do grupowania wiadomości rozproszonych i mieszanych w plikach przez gniazdo sieciowe.źródło
Od w Pythonie 3 identyfikator jest przypisany do wartości, a nie do zmiennej. Oznacza to, że jeśli utworzysz dwie funkcje jak poniżej, wszystkie trzy id są takie same.
źródło
Trochę się spóźniłem i opowiem o Pythonie3. Aby zrozumieć, czym jest id () i jak działa (i Python), rozważ następny przykład:
Musisz myśleć o wszystkim po prawej stronie jak o obiektach. Za każdym razem, gdy dokonujesz przypisania - tworzysz nowy obiekt, a to oznacza nowy identyfikator. W środku widać „dziki” obiekt, który jest tworzony tylko dla funkcji - id (1000). Tak więc jego żywotność dotyczy tylko tej linii kodu. Jeśli zaznaczysz następną linię - zobaczysz, że kiedy tworzymy nową zmienną x, ma ona taki sam identyfikator jak ten dziki obiekt. Prawie działa jak adres pamięci.
źródło
Bądź ostrożny (jeśli chodzi o odpowiedź poniżej) ... To prawda tylko dlatego, że 123 jest między -5 a 256 ...
źródło