我有两个函数foo()
和bar()
,它们使用两个列表l1
和l2
。
foo()
以bar()
和l1
作为参数对l2
进行函数调用。
bar()
会改变列表l1
和l2
。 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()
答案 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
这会使list1
和list2
变异,所以无论谁调用它都会看到变化。并且也会返回list
和list2
,因此无论谁调用它都可以使用结果。
所以,在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
完成执行后,list1
和list2
的更改仍然存在。
另一方面,如果你已经完成了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]