2017-03-15 2 views
2

私は2つの変更可能なオブジェクト(リストとdict)を変更する関数を持っています。
pythonの性質与えられた関数の中でそれらを変更すると、変更は外部から見えるはずです。インプレイス関数を編集するとオブジェクト "参照"が返されるかどうか

私の質問は、値を返すことについてどのような慣例/ベストプラクティスと言いますか?

my_dict = { 
    'flag' : False 
} 

my_list = [ 
    {'color': 'blue'}, 
    {'color': 'yellow'} 
] 

def modify_in_place(my_dict_param, my_list_param): 
    my_dict_param['flag'] = True 
    for item in my_list_param: 
     item['color'] = 'red' 

    # nothing in this case 
    return 

modify_in_place(my_dict, my_list) 
# Now both arguments should reflect their modified states 

上記のコードは、これを実行する最善の方法と考えられていますか?

def modify_in_place(my_dict_param, my_list_param): 
    my_dict_param['flag'] = True 
    for item in my_list_param: 
     item['color'] = 'red' 

    return my_dict_param, my_list_param 

my_dict, my_list = modify_in_place(my_dict, my_list) 

この場合、元の名前の参照を上書きする入力(変更)値が返されます。

結果はどちらの場合も同じであるはずです。

私は質問「より良い」は意見によってバイアスが、PythonはPythonで大会があることである私は、「Pythonの道」

+0

私には2番目の方が良いですが、私がこれをバックアップしなければならないのはPythonのZen of "Explicitが暗黙的です"よりですが、どちらも明示的な議論が可能かもしれません。しかし、あなたは正しい、彼らはほぼ同じ機能を持っている、私は2番目のものは余分な割り当て操作があると思う。 – Hoopdady

+1

@Hoopdady:これは、オブジェクトがインプレースで変更されたことを通知するためにPython APIが明示的に 'None'を返す理由です。 –

+1

関連性:http://stackoverflow.com/a/1682601/6260170 –

答えて

2

について求めている事を行うには、多くの場合、従来の方法を持っていることを考えるかもしれないことを承知しています関数がインプレースで動作している場合、Noneを返します。例えばリストメソッド.sort.appendでこれを見ることができます。リストメソッドは呼び出されたリストを変更しますが、Noneを返します。

最初の例では、returnはまったく必要ありません。

関連する問題