0

2 つの関数foo()とがありbar()、これらは 2 つのリストl1とを使用しますl2

foo()bar()withl1およびl2as 引数の関数呼び出しを行います。

bar()リストl1と を変更しますl2foo()はリストに対するこれらの変更を知る必要があるため、リストは によって返され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。これは、2 つのリストを渡すだけで、それらが変更されることを期待しています。non_mutating_func22 つのリストを渡し、2 つの新しいリストを返すことを期待するトップレベル コードのようなコードで使用できます。どちらも完全に合理的なことです。

于 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

一方、実行した場合list1 = list1 + [5]、それは実行が終了した後も持続しない変更ですfunc2

したがって、上記のコードでは、 の実行が完了した後でも、func1によって 2 つのリストに加えられた変更が認識されます。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 に答える