Cieszę się że cię widzę. Niedawno (2 dni temu, aby być precyzyjnym) postanowił wybrać Pythona (Pythona 3) jako mój pierwszy język programowania. Kiedy zacząłem grać z funkcjami, wpadłem na problem, którego nie mogłem rozwiązać sam i dlatego postanowiłem poprosić o radę tutaj.

Stworzyłem prostą funkcję, która liczy się od 0 do 100000, która jest wywoływana, gdy X = 0. Problemowa część jest taka, gdy zakończyła funkcję, miała zwrócić nową wartość X (co było 100001).

Oto oryginalny kod:

x = 0
def function(x):
    while True:
        print(x)
        x += 1
        if x == 100001:
            return x
            break
if x == 0:
    function(x)
if x==100001:
    print("TRUE")
else:
    print("FALSE")

Jak się spodziewałem po skompilowaniu programu, rozpoczął liczenie na 0 i zakończył się w 100000. Mimo że nadal drukował "fałszywy" na końcu. Grałem ze zmieniającymi się liczbami i małymi szczegółami, ale na końcu nadal nie działało zgodnie z przeznaczeniem. Próbując określić błąd, w którym przekształciłem mój kod:

x = 0
def function(x):
    while True:
        print(x)
        x += 1
        if x == 100001:
            print("x= %d" % x)
            return x
            break
if x == 0:
    function(x)
if x==100001:
    print("TRUE")
else:
    print("x= %d" % x)

Po liczeniu na końcu wyjścia mam następujące linie: x = 100001 x = 0

Myślę, że coś jest nie tak z moim funkcją prawidłowo powracającą "x". Próbowałem sam znaleźć odpowiedź, ale nie powiodło się. Jakieś pomysły?

2
Harry Dogerman 29 czerwiec 2017, 16:42

5 odpowiedzi

Najlepsza odpowiedź

Ponieważ liczby całkowite są niezmienne w Pythonie, nie spodziewaj się, że funkcja zmienia jego wartość.

Jak już wróciłeś X z funkcji, wystarczy go złapać tak:

if x == 0:
    x = function(x)

BTW, możesz upuścić oświadczenie break po powrocie, jest bez znaczenia, gdy powrócisz x o jedną linię powyżej.

3
omri_saadon 29 czerwiec 2017, 13:44

Wartość X nie zmieni się ze względu na odniesienie do zakresu. W ramach Twojej funkcji odwołujesz się do zmiennej lokalnej, X, a nie zmiennej globalnej x. Chcesz ustawić wartość x do wartości zwracanej przez funkcję.

if x == 0:
    x = function(x)

Alternatywnie można użyć global wewnątrz swojej funkcji, aby odwoływać się do zmiennej globalnej, jednak najlepiej byłoby nie mieszać globalnych i lokalnych zakresów.

Dodatkowo lepiej, aby nie używać tych samych deklaracji zmiennych z tego powodu.
Może stać się mylącym, gdy dzielisz nazwy zmiennych i jest bardzo łatwy do zastąpienia wartości, gdy nie jest przeznaczony.

Pomyśl o zakresie jako rozmowy, którą masz: masz dwóch przyjaciół o imieniu John, ale nie są tą samą osobą. Jeśli chcesz rozmawiać tylko z jednym Johnem, a nie drugim, a następnie deklarujesz, że wybierając pożądany John, w tym przypadku zmienna x.

Podczas debugowania jest przydatne, aby wiedzieć, co dostajesz w przyszłości, należy wysłać rzeczywistą wartość zmiennej, aby określić, czy ta wartość jest tym, czego oczekujesz.

if x == 0:
    function(x)
print(x) # Prints 0

Dodano do zmodyfikowanego wywołania funkcji:

if x == 0:
    x = function(x)
print(x) # Prints 100001
0
RobB 29 czerwiec 2017, 14:02

Jest to spowodowane zasadami zakresu zakresu. x wewnątrz Twojej funkcji function nadpisuje x w zasięgu zewnętrznym. Staje się bardziej jasne, jeśli zmienisz nazwę parametru do y i przypisz wartość zwrotu funkcji na x jak w:

x = 0
def function(y):
    while True:
        print(y)
        y += 1
        if y == 100001:
            return y
            break
if x == 0:
    x = function(x)
if x==100001:
    print("TRUE")
else:
    print("FALSE")
0
Daniel Jonsson 29 czerwiec 2017, 13:48

Funkcja (X) to wartość. Jeśli chcesz go zapisać w X, musisz wpłynąć na wynik do wartości. Twój kod powinien być:

if x == 0:
    x = function(x)
if x==100001:
    print("TRUE")
else:
    print("x= %d" % x)

Co więcej, możesz uprościć dużo swojej funkcji, umieszczając test wewnątrz instrukcji podczas gdy instrukcja:

def function():
    x=0
    while (x<=100001):
        print(x)
        x += 1
    return x

Przed wiedząc bardzo dobrze, że robisz, nie zalecam używania przerwy w pętli.

0
Thomas Dussaut 29 czerwiec 2017, 13:48

Ponieważ funkcje mają swój własny zakres lokalny. x wewnątrz funkcji różni się od x na zewnątrz. Podczas gdy x zmienna może być równa 100001, ale w zakresie globalnego jest nadal równa 0, a stąd oświadczenie x==100001 jest fałszywe.

Spróbuj zwrócić wartość boolowską lub x z funkcji (jak @omri_saadon) sugeruje.

Tylko w celach edukacyjnych, a nie polecam tego, aby to zrobić, ale możesz użyć słów kluczowych globalnych, aby używać samej zmiennej X w funkcji.

def function(x):
    global x;
    ...

Teraz twój kod powinien działać jako początkowo oczekiwany.

2
hspandher 29 czerwiec 2017, 13:51