新手变量传递

时间:2012-07-08 02:24:06

标签: python python-2.7

如果你能快速解决我遇到的这个小问题,我真的很感激。到目前为止,在编程方面,我已经做了一些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中修复它。

感谢您的帮助!

3 个答案:

答案 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

但在此之前,明确地逐步做事并没有错。

答案 1 :(得分:3)

这是关于全球和本地范围的问题。虽然您的函数可以作为全局范围值访问x,但是当您重新分配变量时,您正在遮蔽全局,但是您不会返回该值:

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

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

使用局部变量并返回值通常比修改全局变量更好,除非你有完全合理的情况。

关于可变和不可变类型的说明

这种情况还有第二种情况,那就是你正在影响的对象类型。例如,intstring是不可变的。如果不创建新对象,则无法更改其值。 listdict是可变类型的示例。您可以添加和删除它们,更改它们的值。

考虑一个可变类型list

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

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

这将在没有指定全局关键字的情况下附加到全局列表,因为列表本身仍然是相同的列表对象。但是,如果您使用新列表覆盖该列表,而没有全局列表,则不会全局生效:

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

简而言之,如果您只是要修改对象的内容,而不是分配新对象,则可变类型不需要global关键字。

答案 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语言表示,在处理数字时,它的工作原理与所有内容都按值传递一样。