Dodanie elementu do słownika przez input()

0

Dzień dobry,

próbuję uczyć się Pythona i w ogóle programowania od kilku dni, więc wybaczcie, że zadam zapewne głupie pytanie.

Kiedy dodaje element do słownika w taki sposób, wszystko dzieje się zgodnie z oczekiwaniami

dict = {}
key = input('key: ')
value = input('value: ')
dict[key] = value

Chciałem zrobić to samo, ale bez tworzenie zmiennych

dict = {}
dict[input('key: ')] = input('value: ')

Dlaczego w tym przypadku kolejność pytań jest odwrotna?

3

Wirtualna maszyna pythona używa stosu do przechowywania parametrów funkcji.

I jak wykonasz input('value') to wartość zwrócona zostaje wrzucona na stos.
Potem wywołujesz dict[input('key: ')] to po tym jak zrobisz store_subscr to pobiera wartość ze i pod tą wartość zapisuje następną wartość jaka jest na stosie.
To co się pierwsze wkłada na stos jest ostatnie z niego ściągane, najpierw dajesz value, później dict(key), a store_subscr pobiera pierwszy element ze stosu jako miejsce gdzie ma być zapisane, a następny element gdzie to ma być zapisane.

  2           0 BUILD_MAP                0
              2 STORE_FAST               0 (dict)

  3           4 LOAD_GLOBAL              0 (input)
              6 LOAD_CONST               1 ('value: ')
              8 CALL_FUNCTION            1
             10 LOAD_FAST                0 (dict)
             12 LOAD_GLOBAL              0 (input)
             14 LOAD_CONST               2 ('key: ')
             16 CALL_FUNCTION
             18 STORE_SUBSCR

Jak zrobisz to jak w pierwszym przykładzie to najpierw wczytujesz key i przypisujesz do key, potem wczytujesz value i przypisujesz do value i dopiero potem jest wrzucane na stos value, potem key i na końcu wywoływane zapis, który ściąga ze stosu czyli wczytuje w odwrotnej kolejności.

  2           0 BUILD_MAP                0
              2 STORE_FAST               0 (dict)

  3           4 LOAD_GLOBAL              0 (input)
              6 LOAD_CONST               1 ('key: ')
              8 CALL_FUNCTION            1
             10 STORE_FAST               1 (key)

  4          12 LOAD_GLOBAL              0 (input)
             14 LOAD_CONST               2 ('value: ')
             16 CALL_FUNCTION            1
             18 STORE_FAST               2 (value)

  5          20 LOAD_FAST                2 (value)
             22 LOAD_FAST                0 (dict)
             24 LOAD_FAST                1 (key)
             26 STORE_SUBSCR

Czyli jak zrobisz jakieś obliczenia i ze stosu chcesz zapisać wartość pod jakąś zmienną to dajesz store_fast, i potem sobie wczytujesz na stos za pomocą load_fast, żeby przed wywołaniem funkcji parametry na stosie znalazły się w odpowiedniej kolejności.

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