W Pythonie stworzyłem obiekty integer i list w następujący sposób:
a = 10
b = 10
x = []
y = []
Następnie uzyskuję następujące wyniki, porównując identyfikator a
i b
i identyfikator x
i y
id(a)==id(b) returns True
id(x)==id(y) returns False
Gdzieś czytałem, że to zadanie w Pythonie nigdy nie kopiuje danych. Moje pytanie brzmi: dlaczego x i y nie mają tego samego identyfikatora?
Odpowiedzi:
1 dla odpowiedzi № 1Musisz wiedzieć, że wszystkie liczby Pythona są zbuforowane i nieumiejętne, co oznacza, że oba a
i b
etykietują to samo 10
. Listy są obiektami i są przydzielane separetly, dlatego ich identyfikatory są różne od początku
1 dla odpowiedzi nr 2
Listy są zmienne, jeśli ten sam obiekt został użyty, kiedy dodasz element do jednej z list, zobaczysz także zmianę na drugiej.
Tożsamość liczb całkowitych zależy od implementacji i zwykle jest ważna tylko dla małych liczb; dobre czytanie tutaj.
Tak poza tym, ==
jest operatorem równości. Najkrótszy (i czystszy) sposób dla id(a)==id(b)
jest użycie operatora tożsamości is
. W Twoim przypadku: a is b
.
0 dla odpowiedzi № 3
x = []
jest skrótem do tworzenia nowej listy, co oznacza nowy obiekt z nowym identyfikatorem obiektu. Nawet jeśli x
i y
są przypisywane jako puste listy, są to po prostu odniesienia do lokalizacji pamięci przydzielonych dla odpowiednich list. Jeśli id(x) == id(y)
następnie x
i y
udostępniłby ten sam identyfikator obiektu, co w praktyce oznaczałoby, że współużytkują one lokalizację w pamięci lub są odniesieniami do tego samego obiektu (więc wszelkie zmiany wprowadzone do jednego miałyby zastosowanie do drugiego).
Z drugiej strony, id(a) == id(b)
ponieważ są one liczbami całkowitymi, które są prymitywnymi typami danych.