Jaka jest różnica pomiędzy == oraz is. Zróbmy mały teścik.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
a = [ x for x in range(4) ] b = a print(a,b) b[0] = 2 print(a, b) c = list(a) print(a, b, c) print(f"a={a} address={hex(id(a))} repr={a.__repr__}") print(f"b={b} address={hex(id(b))} repr={b.__repr__}") print(f"c={c} address={hex(id(c))} repr={c.__repr__}") print(a is b) print(a == b) print(a == c) print(c is a) |
Wynik powyższego snippetu nie jest zaskakujący.
1 2 3 4 5 6 7 8 9 10 11 12 |
[0, 1, 2, 3] [0, 1, 2, 3] [2, 1, 2, 3] [2, 1, 2, 3] [2, 1, 2, 3] [2, 1, 2, 3] [2, 1, 2, 3] a=[2, 1, 2, 3] address=0x7f439fae9788 repr=<method-wrapper '__repr__' of list object at 0x7f439fae9788> b=[2, 1, 2, 3] address=0x7f439fae9788 repr=<method-wrapper '__repr__' of list object at 0x7f439fae9788> c=[2, 1, 2, 3] address=0x7f439faf3608 repr=<method-wrapper '__repr__' of list object at 0x7f439faf3608> True True True False |
b i a wskazują na ten sam obiekt w pamięci, zatem każda zmiana w a lub b dokonywana jest na tym samym obiekcie. Dlatego też a is b oraz a == b zwracają True.
Lista c jest nowym obiektem stworzonym z kopii a. Wskazuje na inny obszar pamięci zatem a is c zwraca False. Ponieważ a i c mają taka samą zawartość a == c zwraca True. Podsumowując kolokwialnie można stwierdzić, że operator == sprawdza czy obiekty sa takie same, natomiast operator is czy obiekty są identyczne(lub czy obiekt jest tym samym obiektem).