2015-09-02 11 views
1

Почему печати (в квадрате) возвращение вместо ?Почему моя функция не возвращает значение глобальной переменной? [Python]

Я думал, что после того, как вернулся из функции - значение переменной квадратным будет назначен на глобальную переменную с тем же именем?

squared = 0 
def square(n): 
    """Returns the square of a number.""" 
    squared = n**2 
    print "%d squared is %d." % (n, squared) 
    return squared 


square(10) 
print(squared) 

возвращается:

enter image description here

+0

Вам нужно объявить его глобальным, иначе вы создадите новое имя 'squared' в области функции' square'. –

+0

Зачем вам ждать 100? В чем смысл функции, функции предоставляют ** локальную область видимости **. –

+0

@ Ашвини хорошо было бы 100, пока функция не будет вызвана снова с другим n. –

ответ

5

Присвоить результат функции переменной:

squared = square(10) 

Это весь смысл использования return squared в функции, не так ли?

+0

Да, абсолютно, спасибо! Только отказ от ответственности для новичков: Если вы чем-то новичок, и вы используете IDE - что-то вроде ... определение функции простой() печать 5 возвращение 10' ... будет 'print' и 5 и 10 - это может быть интуитивно ошибочным. Вот хорошее видео, которое дало мне лучшую интуицию за печатью и возвратом: https://www.youtube.com/watch?v=2CythYpk7c0 –

+1

@Ruben, вы увидите только 10 (возвращаемое значение), если вы выполняете эту функцию из приглашения интерпретатора. В обычном скрипте возвращаемые значения, которые не привязаны к переменной, просто исчезают. Сосредоточьте свои мысли на этом, а не на авариях переводчика. – alexis

1

По сути то, что происходит здесь, вы создаете локальную переменную в квадратичной функции. Для того, чтобы изменить квадрат, просто введите:

squared =square(10) 
print squared 
3

Функция square никогда не изменяет переменную squared, которая находится в глобальной области. Внутри функции вы объявляете локальную переменную с тем же именем, что и глобальная переменная, однако это изменит локальную переменную, а не глобальную переменную. Затем, когда вы print(squared), вы печатаете эту неизменную глобальную переменную, которая по-прежнему равна 0, когда вы ее первоначально устанавливали. В связи с чистотой кода вы действительно должны стараться избегать использования локальных переменных и глобальных переменных, имеющих одно и то же имя, поскольку это вызывает путаницу (как мы видели в этом вопросе) и делает код намного сложнее читать.

Чтобы изменить глобальную переменную изнутри функции, вы должны сообщить Python об этом, используя global keyword, чтобы сделать имя ссылкой на глобальную переменную. Вы можете посмотреть на этот вопрос: Use of "global" keyword in Python

Проще и лучше, конечно, просто использовать возвращаемое значение функции. Сведение к минимуму использования глобального изменчивого государства - хорошая цель.

+0

Единственный ответ, который фактически объясняет, что происходит. –

-1

Вид. Очень близко. Вы должны изменить следующее:

def square(n): 
    """Returns the square of a number.""" 
    squared = n**2 

To:

def square(n): 
    """Returns the square of a number.""" 
    global squared 

    squared = n**2 

Надеется, что это помогает!

+2

Нет, вам не нужно это менять! ** Нет абсолютно никакой причины для того, чтобы эта переменная была глобальной. ** OP _expects_ он должен быть глобальным, но OP уже продемонстрировал отсутствие понимания нормальных правил определения области видимости и, возможно, концепцию обзора. Учить их злоупотреблять глобальным охватом, а не понимать настоящую проблему - это просто плохие советы. –

+0

"значение квадрата переменной будет присвоено глобальной переменной с тем же именем?" ... Переменная должна быть объявлена ​​глобально до того, как это будет верно. –

+0

Я понимаю, что это неправильный способ программирования на Python - но это ответ объяснил мне вопрос о том, как Python обрабатывает область действия и как возвращаются переменные. Я собираюсь принять этот ответ с отказом от ответственности. *** ЭТО НЕ ХОРОШАЯ ПРАКТИКА *** Но он отвечает на меня оригинальным вопросом - и мог бы сервер дать кому-то тот же вопрос, что у меня была лучшая интуиция. –

Смежные вопросы