2012-07-08 3 views
3

Я бы очень признательна, если бы вы могли быстро дать мне эту небольшую проблему. Пока что в программировании я сделал несколько C, но я смущен тем, как передавать переменные через функции в Python.Переменная новичка, проходящая

Я уверен, что этот вопрос задан много раз, но я понятия не имею, что искать.

Мой код:

x=0 
def getinput(x): 
    x = input('Enter x: ') 
def addtwo(x): 
    x = x + 2 
def printans(x): 
    print 'x is', + x 

getinput(x) 
addtwo(x) 
printans(x) 

printans всегда заканчивается печать 0. Я уверен, что это потому, что переменные внутри функций являются локальными, но я не знаю, как исправить это в python.

Спасибо за помощь!

+0

Downvoter: Вы хотели бы указать причину? Это хорошо написанный вопрос и касается того, что новые программисты на питоне не знакомы. – inspectorG4dget

+1

Я думаю, что некоторые люди считают его подходящим для вопросов, которые они считают слишком простыми, по своему усмотрению. Как будто это неправильно для новичка, чтобы спросить законного вопроса новичков. Не все начинают знать все правильные условия для поиска правильного ответа. Я подтверждаю, что это хорошо написанный вопрос и не достоин нисходящего хода. – jdi

+0

Похоже, я видел внезапное распространение этого конкретного вопроса (не понимая, как работают параметры и значения параметров), как здесь, так и в других местах в Интернете. Интересно, кто-то просто потушил плохой учебник? –

ответ

6

Проблема в том, что вы не возвращаете значения, которые вы получаете/вычисляете внутри своих функций.

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

def addtwo(x): 
    x = x + 2 # compute your result 
    return x # return the result to caller 


result = addtwo(5) # save the returned value 
print result  # print it out 

дает

7 

Вы хотите сделать что-то подобное getinput() функции тоже, так как он получает значение, которое вы хотите использовать в вашей программе. Это контрастирует с printans(), который просто берет информацию для печати, но не вычисляет ничего, что нужно вернуть вам.

Обратите внимание, что, как вы получите более комфортно с этим, вы можете сократить свой код/​​выражение, поэтому для приведенного выше примера, вся ваша функция может состоять из

def addtwo(x): 
    return x + 2 

, но до тех пор нет ничего плохого делать вещи шаг за шагом явно.

2

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

def getinput(): 
    return input('Enter x: ') 

def addtwo(x): 
    return x + 2 

def printans(x): 
    print 'x is', + x 

x = getinput() 
x = addtwo(x) 
printans(x) 

Выражаясь в терминах C, при работе с числами, он работает так же, как если бы все это передать по значению.

3

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

# return local 
def getinput(x): 
    x = input('Enter x: ') 
    return x 

# affect global 
def getinput(x): 
    global x 
    x = input('Enter x: ') 

Использование локальной переменной и возвращает значение в обычно предпочтительнее изменять глобальные переменные, если у вас нет для этого вполне оправданной ситуации.

Примечание о изменяемых и неизменяемых типах

Существует второй случай в эту ситуацию, и что о типе объекта, который вы затрагивающие. int и string, например, являются неизменяемыми.Вы не можете изменить свое значение, не создавая в результате новый объект. A list или dict являются примерами изменяемых типов. Их можно добавлять и удалять, изменяя их значение.

Рассмотрим изменяемого типа list

aList = [] 
def func(): 
    aList.append(1) 

print aList # prints [] 
func() 
print aList # prints [1] 

Это добавит в глобальный список просто отлично даже без указания глобального ключевого слова, потому что сам список все тот же объект списка. Но если вы перезаписать этот список с новым списком, без глобального, он не вступит в силу во всем мире:

aList = [] 
def func(): 
    aList = [1] 

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

+0

Спасибо, всем! Я искал один из способов решить мою проблему, и у меня есть два! –

+0

Есть два пути, но «возврат местного» почти всегда лучший. Определенно используйте это. –

+1

Это скорее изменчивая/непреложная вещь. Если вы изменили изменяемый тип (например, 'list') внутри функции, изменения сохраняются в глобальной области. Это неверно для неизменяемых типов, таких как 'int' – inspectorG4dget

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