0

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

foo()bar()使用l1l2作为参数进行函数调用。

bar()改变列表l1l2. foo()需要知道对列表的这些更改,因此列表由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

4 回答 4

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
于 2012-12-31T20:09:21.543 回答
0

从你的描述和评论来看,你的真实func2样子是这样的:

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

这会发生变化list1list2就位,因此无论谁调用它,都会看到变化。它还返回and ,所以任何调用它的人都可以这样使用结果。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在代码中使用类似于顶级代码的代码,它传递两个列表并期望返回两个新列表。两者都是完全合理的事情。

于 2012-12-31T20:16:07.820 回答
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]
于 2012-12-31T20:18:23.480 回答
-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

另一方面,如果您要 done ,那是在完成执行list1 = list1 + [5]后不会持续存在的更改。func2

因此,使用上面的代码,即使在执行完成之后,func1也会知道对两个列表所做的更改。func2func2

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]
于 2012-12-31T20:15:53.373 回答