2013-03-20 9 views
5

Tego they miećodniesieniu do przykładu Fibonacciego w poradniku funkcji Pythona

def fib(n): 
    a, b = 0, 1 
    while a < n: 
     print a, 
     a, b = b, a+b 

To właśnie mieć

def fib(n): 
    a = 0 
    b = 1 
    while a < n: 
     print a 
     a = b 
     b = b+a 

Pierwsze powraca prawidłową sekwencję, gdy są stosowane, natomiast min wpływów 0, 1, 2, 4, 8, 16, 32 ...

Obecnie uczę się programowania (bez wcześniejszej edukacji informatycznej) i jasne jest, że problem polega na tym, jak zdefiniowałem zmienne. Jaka jest różnica między rozdzielaniem zmiennych przez przecinki i rozdzielaniem zmiennych przez nową linię (zakładając, że jest to problem)?

Odpowiedz

8

To przyporządkowanie krotka:

a, b = 0, 1 

Można również pomyśleć o tym, jak

(a, b) = (0, 1) 

tymczasowy krotka jest tworzony z wartościami 0 i 1 a następnie rozpakowywane na zmiennej a i b

Jest to również zadanie krotki

a, b = b, a+b 

Ponownie, można myśleć o nim jako

(a, b) = (b, a+b) 

Tymczasowa krotka jest tworzony z wartości b i a+bzanim któryś z nich jest aktualizowana. Przypisanie następuje tylko po utworzeniu tymczasowej krotki po.

Poprzez podzielenie go na osobne kroki, zmieniasz znaczenie kodu.

Pozwala zobaczyć, co się dzieje tutaj

a, b = 0, 1  # a=0 , b=1 
a, b = b, a+b  # a=1 , b=1 

Porównaj z

a = 0    # a=0 
b = 1    # a=0 , b=1 
a = b    # a=1 , b=1 
b = b+a   # a=1 , b=2 
+0

Dokładnie to musiałem wiedzieć (nie jestem zaznajomiony z zasadą przydziału krotek). Dziękuję Ci. – user2189389

5

jest tylko jedna różnica:

W pierwszym przyporządkowanie b = b+a odbywa się przed zmianą a. Wynika to z faktu, że zarówno wyrażenie w RHS jest oceniane najpierw, zanim zostanie wykonane przypisanie.

Podczas gdy w drugim, drugie zadanie jest wykonywane po modyfikacji a. Właśnie dlatego widzisz zły wynik.

Więc w kodzie:

b = b + a 

jest rzeczywiście:

b = b + b 

ponieważ a została już przypisana wartość b.

+0

Niestety, ale to nie jest intuicyjnie oczywiste dla mnie, ale to dlatego, że jestem nadal próbuje zdobyć zrozumienie sama składnia. Patrząc na pierwszy przykład, w jaki sposób b = b + a jest przypisany pierwszy? Próbowałem zamienić pozycję a = b i b = b + a w moim kodzie, ale nie wpłynęło to na wynik. EDYCJA: Widzę, że mój porządek przypisania zmiennej zamówienia jest nieprawidłowy, ale przeczytałem samouczek w tej kolejności. Ponieważ wygląda na to, że został mi najpierw przeniesiony. – user2189389

Powiązane problemy