2012-07-08 49 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。我确信这是因为函数内部的变量是本地的,但我不知道如何解决这个问题。

感谢您的帮助!

+0

Downvoter:你想提供一个理由吗?这是一个写得很好的问题,它解决了一些新的Python程序员不熟悉的问题。 – inspectorG4dget 2012-07-08 03:19:48

+1

我认为有些人认为应该减少他们认为对自己来说太过基本的问题。仿佛它对于一个初学者来说是错误的问一个合法的初学者的问题。并不是每个人都知道所有正确的术语来寻找正确的答案。我支持这是一个写得很好的问题,不值得赞扬。 – jdi 2012-07-08 03:57:08

+0

似乎我已经看到这种特定类型的问题(无法理解参数传递和返回值如何工作)的突然激增,无论是在这里还是在互联网上的其他地方。我想知道是否有人推出了一个错误的教程? – 2012-07-08 04:52:58

回答

6

问题是,你没有返回你的函数中得到/计算的值

我不会给你所有的代码,但如果你理解这个例子,你将能够根据需要对你自己的代码进行必要的调整,作为学习编程的一部分蟒蛇。

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: ') 

使用局部变量和返回值通常更喜欢修改全局变量,除非你有一个完全合理的情况。

关于可变和不可变类型

还有第二个情况下,这种情况,那是关于对象的你所影响的说明文字。例如,intstring是不可变的。因此,如果不创建新对象,则无法更改其值。 A listdict是可变类型的示例。你可以添加和删除它们,改变它们的值。

考虑一个可变类型list

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

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

这将追加到全局列表就好了,甚至没有指定一个全球性的关键词,因为列表本身仍然是相同的列表对象。但是,如果你要覆盖一个新的列表清单,如果没有全球性的,它不会全局生效:

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

简而言之,可变类型并不需要全球的关键字,如果你只是要修改对象的内容,但不分配新的对象。

+0

谢谢大家!我正在寻找一种方法来解决我的问题,我得到了两个! – 2012-07-08 02:46:28

+0

有两种方法,但“返回本地”几乎总是比较好的一种。绝对使用那个。 – 2012-07-08 02:47:25

+1

它更像是一个可变/不可变的东西。如果你修改了一个函数内部的可变类型(比如'list'),那么这些变化会在全局范围内持续存在。对于像int这样的不可变类型,这不是真的。 – inspectorG4dget 2012-07-08 03:18:44