在函数中完成的列表更改范围到被调用函数

时间:2012-12-31 20:00:00

标签: python list scope

我有两个函数foo()bar(),它们使用两个列表l1l2

foo()bar()l1作为参数对l2进行函数调用。

bar()会改变列表l1l2foo()需要知道列表的这些更改,因此列表由bar()返回。

而不是将列表作为参数传递并返回它们是否有更好的方法来更新foo()中的列表?

def bar(l1, l2):
     value=10
     l1.append(value)
     l2.append(value)
     return l1,l2

def foo() :
    list1=[]
    list2=[]
    list1, list2 = bar(list1,list2)

def main():
    foo()

if __name__ == '__main__':
    main()

4 个答案:

答案 0 :(得分:2)

正如其他人提到的,因为你正在修改传入的列表的内容 - 就地 - 你不需要返回任何东西

def func2 (list1,list2):
     value=10
     list1.append(value)
     list2.append(value)

listA = [1,2,3]
listB = [7,8,9]

func2(listA,listB)

print listA
print listB

答案 1 :(得分:0)

根据您的说明和评论,您的真实func2看起来像这样:

def func2(list1, list2):
    value = 'a'
    list1.append(value)
    list2.append(value)
    return list1,list2

这会使list1list2变异,所以无论谁调用它都会看到变化。并且会返回listlist2,因此无论谁调用它都可以使用结果。

所以,在func1:

def func1() :
    list1=[]
    list2=[]
    func2(list1, list2)
    print(list1, list2)

您将看到两个值均为['a']

如果你这样做:

(list1,list2) = func2([],[])
print(list1, list2)

会看到这两个值都是['a']

您实际上并不需要 - 或者通常希望 - 同时改变值返回它们。只做一个或另一个:

def mutating_func2(list1, list2):
    value = 'a'
    list1.append(value)
    list2.append(value)

def non_mutating_func2(list1, list2):
    value = 'a'
    return list1+[value], list2+[value]

您可以在mutating_func2之类的代码中使用func1,它只传递两个列表并希望对其进行修改。您可以在代码中使用non_mutating_func2,例如您的顶级代码,它会传递两个列表并希望返回两个新列表。两者都是完全合理的事情。

答案 2 :(得分:0)

查看修改后的问题,无需返回列表,无论如何都会通过引用传递,并将被修改:

def func2 (list1,list2):
     value=10
     list1.append(value)
     list2.append(value)

def func1() :
    list1=[]
    list2=[]
    func2(list1,list2)
    print "list1:",list1,"list2:",list2
    func2(list1,list2)
    print "list1:",list1,"list2:",list2
    func2(list1,list2)
    print "list1:",list1,"list2:",list2

def main():
    func1()

if __name__ == '__main__':
    main()

给出:

list1: [10] list2: [10]
list1: [10, 10] list2: [10, 10]
list1: [10, 10, 10] list2: [10, 10, 10]

答案 3 :(得分:-1)

我修改了您的代码,如下所示:

def func2(list1, list2):
     value=10
     list1.append(value)
     list2.append(value)

def func1():
    list1=[]
    list2=[]
    func2(list1,list2)

请注意func2不会返回任何内容。这不是问题,因为它使用list.append来修改列表 IN-PLACE 。这意味着当func2完成执行后,list1list2的更改仍然存在。

另一方面,如果你已经完成了list1 = list1 + [5],那么这是一个在func2完成执行后不会持续的更改。

因此,使用上述代码,即使func1的执行完成,func2也会知道func2对这两个列表所做的更改。

In [13]: def func2(list1, list2):
   ....:     value = 'a'
   ....:     list1.append(value)
   ....:     list2.append(value)
   ....:     

In [14]: def func1():
   ....:     myList = []
   ....:     myOtherList = [1]
   ....:     print myList, myOtherList
   ....:     func2(myList, myOtherList)
   ....:     print myList, myOtherList
   ....:     

In [15]: func1()
[] [1]
['a'] [1, 'a']


In [16]: def otherfunc2(list1, list2):
   ....:     value = 'a'
   ....:     list1 = list1 + [value]
   ....:     list2 = list2 + [value]
   ....:     


In [17]: def func1():
   ....:     myList = []
   ....:     myOtherList = [1]
   ....:     print myList, myOtherList
   ....:     otherfunc2(myList, myOtherList)
   ....:     print myList, myOtherList
   ....:     

In [18]: func1()
[] [1]
[] [1]