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.