2016-10-03 6 views
-2

У меня есть вопрос о выходе из следующего кода:глобальные и локальные переменные заблуждением

def f(): 

    global s 
    print(s) 
    s = "That's clear." 
    print(s) 

s = "Python is great!" 
f() 
print(s) 

Выход заключается в следующем:

Python is great!

That's clear.

That's clear.

Мой вопрос: Почему это самый последний выход (т. е. третий выход) также «Это понятно».
Как получилось, третий выход не «Python - это здорово!» , Я думал, что последнее утверждение из кода (т. Е. Print (s)) находится вне функции f(). Так что не следует печатать (ы) здесь, смотрим на переменную s, которая определена глобально? в этом случае глобально определенная переменная s будет ссылаться на значение «Python is great!», не так ли? Извините, мне нужно понять некоторые понятия. Я очень новичок в python. Может кто-то любезно объяснить эту простую концепцию.

+1

Очевидно, что вы ошиблись в своем отступе, поэтому трудно ответить на ожидаемое поведение, не зная, что является правильным. – polku

+0

Давайте возьмем летящее предположение и предположим, что, поскольку вы объявили '' 'глобальным, переопределение' '' в функции 'f' изменило глобальные' '' на 'That is clear' –

+0

@John_w, я исправил ваш отступ, это очевидно в этом случае, но в целом попытайтесь опубликовать код точно в том же формате, что и локально. –

ответ

-1

Предполагая, что вы указали переменную s = "Python is great!" по всему миру. Вы, возможно, не отступом код правильно, код ниже:

def f(): 
    global s 
    print(s) 
    s = "That's clear." 
    print(s) 

    s = "Python is great!" 
f() 
print(s) 

даст вам выход

Python is great!

That's clear.

Python is great!

код, который вы написали должны по существу давать бесконечную рекурсию и должны достичь макс глубина рекурсии.

отступы очень важны в питоне, когда вы отступ вызова f() функции и оператор print(s), питон считает оба этих заявления, чтобы быть частью функции f(). Когда во время первого вызова функции достигается оператор f(), python автоматически вызовет функцию снова и повторит весь процесс. На самом деле вы никогда не сможете достичь третьего отчета о печати.

0

Чтобы увидеть вывод, который вы делаете, структура вами код должен быть:

def f(): 
    global s 
    print(s) # s outside the function 
    s = "That's clear." # new global s created 
    print(s) # print the new s 

s = "Python is great!" # s before you call the function/get to s = "That's clear." 
f() # f gets called and new global s is created 
print(s) # you see the new global s created in the function 

Создание сек глобальные средства, которые вы видите его за рамки f, вы уже выполнили функцию по раз, когда вы дойдете до последней печати так что теперь сек точек на That's clear.

Если вы хотите, чтобы получить выход вы ожидали, вы бы передать s в функцию и не использовать глобальное ключевое слово так s, созданный в f, будет доступен только в рамках самой функции.

def f(s): 
    print(s) 
    s = "That's clear." 
    print(s) 

s = "Python is great!" 
f(s) 
print(s) 

Это должно быть хорошим уроком о том, почему с помощью глобальной редко является хорошей идеей.

+0

Спасибо. Является ли утверждение «global s» внутри функции f здесь означающим, что s на второй строке (т.print (s)) внутри функции f относится к переменной s вне функции i.e. s = «Python отлично!» или «global s» говорит, что третья строка в функции (т. е. s = «Это ясно») должна быть сделана как глобальная переменная? –

+0

Если вы удалили глобальное значение, вы получите ошибку 'UnboundLocalError: локальная переменная ', указанную перед присваиванием, по мере того, как вы переназначили s в функции, если вы только что имели' print (s) 'в функции, которую вы видите' Python отлично! 'поскольку s находится в глобальном пространстве имен, используя глобальный, вы все равно можете получить доступ к s, назначенным вне функции, без какой-либо ошибки, но вы переназначите s внутри функции, так что, поскольку вы использовали global, вы видите новое значение s вне f при печати –