2016-07-20 7 views
1

私がPythonで理解しているように、関数のパラメータに変数を渡すと、元の変数を参照しています。私の実装では、関数に渡す変数を同じにしようとすると、空のリストが返されました。参照によるPython呼び出し

これは私のコードです:

#on the main ------------- 
temp_obj = [] 
obj = [ 
    {'name':'a1', 'level':0}, 
    {'name':'a2', 'level':0}, 
    {'name':'a3', 'level':1}, 
    {'name':'a4', 'level':1}, 
    {'name':'a5', 'level':2}, 
    {'name':'a6', 'level':2}, 
] 

the_result = myFunction(obj, temp_obj) 

print(temp_obj) 
#above print would result to an empty list 
#this is my problem 

#end of main body ------------- 


def myFunction(obj, new_temp_obj): 
    inside_list = [] 
    for x in obj[:]: 
     if x['level'] == 0: 
       inside_list.append(x) 
       obj.remove(x) #removing the element that was added to the inside_list 

    new_temp_obj = obj[:] #copying the remaining element 

    print(new_temp_obj) 
    # the above print would result to 
    #[{'name': 'a3', 'level': 1}, {'name': 'a4', 'level': 1}, {'name': 'a5', 'level': 2}, {'name': 'a6', 'level': 2}] 

    return inside_list 

私は何かが足りないか、私は参照することにより、Pythonのコールの考えを誤解したのですか?

+0

'obj [:]'の代わりに 'list(obj)'を使います。それはよりよく見えます。 – pushkin

答えて

1

Pythonは参照渡しではありません。これはオブジェクトごとのパスです。

は、次の2つの関数を考えてみましょう:

def f(mylist): 
    mylist = [] 

def g(mylist): 
    mylist.append(1) 

今度は、私はそれらを呼び出すとしましょう。

mylist = [1] 
f(mylist) 
print(mylist) 

mylist = [1] # reset the list 
g(mylist) 
print(mylist) 

出力は何ですか?

Pythonがの値がだった場合、関数はリストのコピーを取るため、関数を復帰すると元のリストには影響しません。どちらの場合でも、元のリスト[1]を印刷します。

Pythonは参照渡した場合、機能は、オブジェクトへの参照を受け入れ、それが基準参照する実際のオブジェクトを変更することになる修正、第1の出力は、[]と第、[1,2]あろうだろう。

この例を実行すると、最初の出力は[1](影響を受けていない場合はリスト)、2番目の出力が[1,2](影響を受けるリスト)になります。あなたがnew_temp_obj = obj[:]を行うと

O_O

、Pythonは新しいオブジェクトobj[:]を構築し、名前new_temp_objを与えています。

appendの場合、Pythonはnew_temp_objという名前のものを探し、要素を追加します。あなたが渡した引数は、リストを探す場所を指示します。

あなたは、メモリ内のまったく新しい場所で全く新しいオブジェクトを作成していると、単にこれは別の新しいリストオブジェクトへのnew_temp_objの参照になるだろうnew_temp_obj

+0

よく説明していただきありがとうございます。それは私に多くの助けとなり、何か新しいことを理解する。再度、感謝します。 –

+0

喜んで助けてください!まだ質問がある場合、[ここ](http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/)徹底した説明。 – pushkin

1
new_temp_obj = obj[:] #copying the remaining element 

、それを同じ名前を与えます。 idを使用して、この割り当てでそのidが変更されていることを確認できます。

変更それがに:

new_temp_obj[:] = obj[:] 

あなたが期待した結果が表示されます。

+0

ありがとうございました! –

関連する問題