2017-12-21 5 views
0

次のコード行を実行すると、cv2を使用して元のイメージ(つまりimg)を描画します。私が知る限り、それはそうしましたが、imgを変更しました(これは望ましくありませんでした)。引数をコピーするためのベストプラクティスは、意図せずに引数を変更しないようにするメソッドへの参照渡し

cbImg = cv2.drawChessboardCorners(img, (nx, ny), corners, ret) 

私はPythonが参照渡しであることを理解しています。これは、引数がメソッドによって変更できることを意味します。原画像を修正回避するために、(以下に示すように、例えば)私は方法を変更することができないので、私はcv2.drawChessboardCorners()へのコピーを渡さ

cbImg = cv2.drawChessboardCorners(copy.copy(img), (nx, ny), corners, ret) 

コピー上で動作させる必要があります。しかし、私はコピーがメソッド内で実行される多くの例を見てきました。

コピーをどこで行うべきかに関するベストプラクティスはありますか?言い換えれば、他の人の方法を使用している場合は、元のイメージが変更されていないことを確認するためにコピーを渡す必要がありますか?代わりに、自分のメソッドを書くときに、自分のメソッド内でコピーを実行して、他の人の主張を意図せずに変更しないようにする必要がありますか?さらに、参照渡しの引数を変更する(またはしない)と仮定するのが一般的にはお勧めですか?

+0

オブジェクト**はPythonではリファレンス**によって決して渡されません。 Pythonは参照渡しのセマンティクスをサポートしておらず、すべての関数呼び出しは同じ評価方法を使用しています。 –

+2

つまり、「Pythonが参照渡しであることを理解しています。これは、引数がメソッドによって変更できることを意味します。間違っている。参照渡しでは、呼び出し側で引数への代入*が行われます。つまり、 'f(x):x = 13'は呼び出し側の' f(y) 'に' y'を再割り当てさせます。これはPythonでは当てはまりません。技術名称は、Pythonで「割当によって渡す」と呼ばれることもあります(https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)。 Java、Ruby、Javascriptなど、現代の言語で使用されているのと同じ戦略です。 –

+0

「オブジェクト」ではなく「引数」に質問を編集しました。質問をするためのより良い用語があれば、私は説明を明確にするためにさらに質問を編集して満足しています。根本的な問題は同じままです...メソッドは、それに渡されるものを変更します。コピーがどこで実行されるか(つまり、メソッドにコピーを渡すか、メソッド内でコピーを作成するか)に関するベストプラクティスはありますか? – user2514157

答えて

1

関数が引数を変更するかどうかを明確にすることがベストプラクティスです。理想的には、それは理由が分かりやすいので、できません。データが大きくない場合、新しい値を作成して返すことはオプションです。

ファンクションがその引数を変更することがわかっていて、元の値と変更された値の両方が必要な場合は、コピーを作成してください。

関連する問題