Prośba początkującego o wyjaśnienie: przypisywanie nazw

0

Witam serdecznie użytkowników forum. Czytam sobie książeczkę pt. „Hello world. Przygoda z programowaniem dla dzieci i absolutnie początkujących i natknąłem się na takie wyjaśnienie:
„tę samą wartość możesz przypisać do kilku nazw-jedna rzecz może mieć kilka nazw:”

my_teacher=”Mrs Smith”
your_teacher=my_teacher
print(my_teacher)
print(your_teacher)

„To tak, jakby przypiąć dwie etykiety do jednej rzeczy. Na jednej etykiecie będzie napis: your_ teacher, an na drugiej napis: my_teacher, ale obie będą przypięte do etykiety Mrs Smith.”

Trochę się zamotałem. Czy nie powinny być dwie osobne etykiety Mrs Smith a nie jedna.
Np,:

my_teacher=”Mrs Smith”
your_teacher=”Mrs Smith”
print(my_teacher)
print(your_teacher)

Zapewne niezbyt dobrze zarysowałem problem, ale może ktoś pomoże mi zrozumieć ten banalny problem. Z góry dziękuję i pozdrawiam Krzysztof:)

0

Nie, nie powinny być, po prostu, do dwu różnych zmiennych Przypisłeś tą samą wartość, co w tym dziwnego?

1

Obydwa przypadki są równoważne dla tego prostego przykładu. Pierwszy przypadek ma jednak zaletę w postaci braku duplikacji deklaracji wartości "rzeczy" (zmiennej). Jeżeli w przyszłości będziemy musieli zmodyfikować kod i zastąpić "Mrs Smith" na "Mrs Jones", w pierwszym przypadku będziemy musieli zmodyfikować jedną linię kodu, a w drugim przypadku dwie. Jeżeli dodatkowo linia "your_teacher=..." jest oddalona od "my_teacher=...", to w drugim przypadku łatwiej o popełnienie blędu (zostawienie starej wartości).

0

Bardzo dziękuję za odpowiedzi. Poniżej link do anglojęzycznej wersji książki z której zaczerpnąłem przykład. ( posiadam polską z Helionu).

http://home.ustc.edu.cn/~ustcsh/py20[...]rs-Manning%20Publications.pdf

Na stronie 21 (46 z 490) znajduje się ilustracja przedstawiająca tą samą wartość przypisaną do dwóch różnych zmiennych. To ta ilustracja wywołała moje wątpliwości. Rozumiem że do dwóch różnych zmiennych można przypisać tę samą wartość, ale czy na schemacie nie powinny być dwie etykiety Mrs Goodyear.W pamięci rezerwowane są chyba dwie „szufladki”- jedna dla zmiennej moja nauczycielka, druga twoja nauczycielka. Stąd wykombinowałem że powinny być dwie etykiety mrs goodyear.

0

Ilość "szufladek" w których Python przechowuje dane to "implementation detail". Python potrafi rozpoznać które zmienne są typu "immutable" (nie można zmienić zawartości "szufladki") i wykorzystać ten sam obszar pamięci do przechowywania danych niezależnych zmiennych, jeżeli ich wartość jest taka sama:

>>> x = "a"
>>> y = "a"
>>> id(x)
139994499557616
>>> id(y)
139994499557616
>>>
0

@CaliforniaDreaming:
Dla zbyt dużych stringów, id nie będzie takie same...

>>> x = "123456789abcdefghijklmnfjlsdmad jgnsdkldaklmgjklofiopdasjogdfiojdas iojgiopftioskfi0dfgiojkdiofsdiokioasi dklasfmklsmklfmsdkl mfsdklmfklsdmfklsdmklfmsdklfm sdklfmkldsmfklsdmfklsdmfklsdm kldsmklfdmsfklmsdfklmsd klfmsdklmfsdklmfkldsmklfm sdklmklsdmfklsdmfklsdmfkldsmfkl sdmfklmsdklfmsdklfmsdklmfklsdmfklsd mfklsdmfklsdmfklsdmfklmsdklmfklsdmf ksdlmdsklmfsdklfmklsdmfklmsd"
>>> y = "123456789abcdefghijklmnfjlsdmad jgnsdkldaklmgjklofiopdasjogdfiojdas iojgiopftioskfi0dfgiojkdiofsdiokioasi dklasfmklsmklfmsdkl mfsdklmfklsdmfklsdmklfmsdklfm sdklfmkldsmfklsdmfklsdmfklsdm kldsmklfdmsfklmsdfklmsd klfmsdklmfsdklmfkldsmklfm sdklmklsdmfklsdmfklsdmfkldsmfkl sdmfklmsdklfmsdklfmsdklmfklsdmfklsd mfklsdmfklsdmfklsdmfklmsdklmfklsdmf ksdlmdsklmfsdklfmklsdmfklmsd"
>>> id(x)
10370208
>>> id(y)
20025776
>>> y = x
>>> id(y)
10370208

@crispia:
Dla stringów to ma małe znaczenie, bo nie można ich zmieniać. Każda modyfikacja tworzy nowy obiekt.
Gdybyś użył np. listy do przechowywania tego stringa, to zmiana stringa wewnątrz tej listy zmieni go wszędzie, gdzie ta lista jest przypisana.

my_teacher=["Mrs Smith"]
your_teacher=my_teacher
print(my_teacher[0]) # wypisze: Mrs Smith
print(your_teacher[0]) # wypisze: Mrs Smith

your_teacher[0] = "Mr Wayne"
print(my_teacher[0]) # wypisze: Mr Wayne
print(your_teacher[0]) # wypisze: Mr Wayne

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0