Python:在函数之间传递变量

use*_*818 36 python arguments function

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

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

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()
Run Code Online (Sandbox Code Playgroud)

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

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

然而,这显然是错误的理解.我的输出是:

For checking purposes: in defineAList, list is ['1', '2', '3']
For checking purposes: in useTheList, list is []
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Pav*_*sov 40

这是实际发生的事情:

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()
Run Code Online (Sandbox Code Playgroud)

这就是你想要的:

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()
Run Code Online (Sandbox Code Playgroud)

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

def main():
    # passed_list inside useTheList is set to what is returned from defineAList
    useTheList(defineAList()) 
Run Code Online (Sandbox Code Playgroud)


Sil*_*Ray 9

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

def main():
    l = defineAList()
    useTheList(l)
Run Code Online (Sandbox Code Playgroud)

或者:

def main():
    useTheList(defineAList())
Run Code Online (Sandbox Code Playgroud)

或者(虽然你不应该这样做!一开始可能看起来不错,但是从长远来看,全局变量会让你感到悲伤.):

l = []

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

def main():
    global l
    defineAList()
    useTheList(l)
Run Code Online (Sandbox Code Playgroud)

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