Python:在函数之间传递变量

时间:2013-04-16 17:54:40

标签: python function arguments

我花了几个小时在这里和其他地方阅读,以及尝试,但我并不真正理解我确信这是一个非常基本的概念:在不同的函数之间传递值(作为变量)。

例如,我将一大堆值分配给一个函数中的列表,然后想在以后的另一个函数中使用该列表:

list = []

def defineAList():
    list = ['1','2','3']
    print "For checking purposes: in defineAList, list is",list
    return list

def useTheList(list):
    print "For checking purposes: in useTheList, list is",list

def main():
    defineAList()
    useTheList(list)

main()

根据我对函数参数的理解,我希望这样做如下:

  1. 将'list'初始化为空列表;打电话给主(至少,我知道我说得对......)
  2. 在defineAList()中,将某些值分配到列表中;然后将新列表传递回main()
  3. 在main()中,调用useTheList(list)
  4. 由于'list'包含在useTheList函数的参数中,我希望useTheList现在可以使用defineAList()定义的列表,而不是在调用main之前定义的空列表。
  5. 然而,这显然是错误的理解。我的输出是:

    For checking purposes: in defineAList, list is ['1', '2', '3']
    For checking purposes: in useTheList, list is []
    

    所以,既然“回归”显然没有做到我认为它做的事情,或者至少它没有像我认为的那样去做......它实际上做了什么?你可以告诉我,使用这个例子,我需要做什么来从defineAList()获取列表并在useTheList()中使用它?当我看到它们发生时,我倾向于更好地理解事物,但是我所看到的很多适当的参数传递的例子也使用了我不熟悉的代码,并且在弄清楚发生了什么的过程中,我我真的没有理解这个概念。我正在使用2.7。

    ETA-在过去,提出类似的问题,有人建议我使用全局变量而不仅仅是本地变量。如果它在这里也是相关的 - 为了我正在上课的目的,我们不允许使用全局变量。

    谢谢!

7 个答案:

答案 0 :(得分:34)

这就是实际发生的事情:

global_list = []

def defineAList():
    local_list = ['1','2','3']
    print "For checking purposes: in defineAList, list is", local_list 
    return local_list 

def useTheList(passed_list):
    print "For checking purposes: in useTheList, list is", passed_list

def main():
    # returned list is ignored
    returned_list = defineAList()   

    # passed_list inside useTheList is set to global_list
    useTheList(global_list) 

main()

这就是你想要的:

def defineAList():
    local_list = ['1','2','3']
    print "For checking purposes: in defineAList, list is", local_list 
    return local_list 

def useTheList(passed_list):
    print "For checking purposes: in useTheList, list is", passed_list

def main():
    # returned list is ignored
    returned_list = defineAList()   

    # passed_list inside useTheList is set to what is returned from defineAList
    useTheList(returned_list) 

main()

您甚至可以跳过临时returned_list并将返回的值直接传递给useTheList

def main():
    # passed_list inside useTheList is set to what is returned from defineAList
    useTheList(defineAList()) 

答案 1 :(得分:9)

你只是错过了一个关键步骤。您必须将返回值显式传递给第二个函数。

def main():
    l = defineAList()
    useTheList(l)

可替换地:

def main():
    useTheList(defineAList())

或者(虽然你不应该这样做!起初看起来似乎不错,但是从长远来看,全局变量会让你感到悲伤。):

l = []

def defineAList():
    global l
    l.extend(['1','2','3'])

def main():
    global l
    defineAList()
    useTheList(l)

该函数返回一个值,但它不会像您的代码所假设的那样在任何类型的全局命名空间中创建符号。您必须实际捕获调用范围中的返回值,然后将其用于后续操作。

答案 2 :(得分:3)

如果你没有指定,你的回报就没用了

list=defineAList()

答案 3 :(得分:2)

阅读名称空间的概念。在函数中分配变量时,只能在此函数的命名空间中指定它。 但显然你想在所有功能之间使用它。

def defineAList():
    #list = ['1','2','3'] this creates a new list, named list in the current namespace.
    #same name, different list!

    list.extend['1', '2', '3', '4'] #this uses a method of the existing list, which is in an outer namespace
    print "For checking purposes: in defineAList, list is",list
    return list

或者,您可以传递它:

def main():
    new_list = defineAList()
    useTheList(new_list)

答案 4 :(得分:1)

return返回一个值。你赋予该值的名称无关紧要。返回它只是“传递出去”,以便其他东西可以使用它。如果你想使用它,你必须从外面抓住它:

lst = defineAList()
useTheList(lst)

list内部返回defineAList并不意味着“使程序的其余部分可以使用该变量”。这意味着“将这个变量传递出去,给程序的其余部分一次机会抓住它并使用它”。您需要将该值分配给函数外部的某些内容才能使用它。此外,正因为如此,您无需使用list = []提前定义列表。在defineAList内,您创建一个新列表并将其返回;此列表与您在开始时使用list = []定义的列表没有任何关系。

顺便提一下,我将您的变量名称从list更改为lst。使用list作为变量名称并不是一个好主意,因为它已经是内置Python类型的名称。如果您创建自己的名为list的变量,则无法再访问内置变量。

答案 5 :(得分:1)

将变量从一个函数作为参数传递给其他函数可以像这样完成

定义像这样的函数

  
def function1():
global a
a=input("Enter any number\t")

def function2(argument):
print ("this is the entered number - ",argument)
  

调用这样的函数

function1()
function2(a)

答案 6 :(得分:1)

尝试执行以下操作:

def funa():
    name=("Bob")
    age=("42")
    return name, age

def funb():
    name, age=funa()
    print(name)
    print(age)

funb()

碰巧你必须通过 funa() 而不是 age 来调用它。