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 中修复它。

谢谢您的帮助!

4

3 回答 3

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()function 的事情,因为它得到了你想在你的程序中使用的值。相比之下printans(),它只需要打印信息,但不计算需要返回给您的任何内容。

请注意,当您对此更加熟悉时,可以缩短代码/表达式,因此对于上面的示例,您的整个函数可能包括

 def addtwo(x):
    return x + 2

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

于 2012-07-08T02:27:21.260 回答
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,例如,是不可变的。如果不创建新对象,则无法更改它们的值。A listordict是可变类型的示例。您可以添加和删除它们,更改它们的值。

考虑一个可变类型list

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

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

这将很好地附加到全局列表,甚至无需指定全局关键字,因为列表本身仍然是相同的列表对象。但是如果你用一个新列表覆盖该列表,没有全局,它将不会全局生效:

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

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

于 2012-07-08T02:28:00.390 回答
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 语言来说,在处理数字时,它的工作方式与一切都是按值传递一样。

于 2012-07-08T02:27:26.287 回答