1

Pythonのヒッチハイカーガイドには、変数名を再利用するのが良いと書かれています。

foo = Spam()
bar = foo.eggs()

そして、私はそれに同意します。コードを読みやすくします。

変数が40MBのデータである場合はどうなりますか?それ自体をコピーして、合計で80 MBになりますか?

foo = buffer  # 40 MB.
bar = foo.resize((50, 50))  # +40?

関数が実行されるときにメモリが解放されることは知っていますが、読みやすさのためだけに、アプリの1つの状態でメモリ使用量を2倍にするのは良い考えではないと思います。特別な場合のようですが、一方で、特別な場合は特別ではありませんね。

4

2 に答える 2

6

Pythonの割り当てでは、参照値をターゲットオブジェクトにコピーするだけです。データのコピーはありません。Python変数は、Pythonシステムディクショナリ内の名前に、オブジェクトへの参照値である値を加えたものです。

実際には、割り当てに注意する必要があります。Pythonの割り当ては、参照値を共有することを意味します。Pythonの割り当ては、ターゲットオブジェクトをコピーすることを意味するものではありません。文字列や数値などの不変オブジェクトを操作する場合、問題は発生しません。ただし、可変オブジェクト(リスト、ディクショナリ、セット、一部のユーザーオブジェクト)を割り当てる場合は、その後はターゲットオブジェクトに別の名前(参照値の別のコピーを介したアクセス)のみを指定することに注意してください。

オブジェクトを関数/メソッド引数として渡す場合も同じです。

于 2012-11-12T08:25:57.760 に答える
4

サイズを変更する前に(気になるビットを読み取るだけでなく)そのデータを完全にメモリに保持する必要がある場合は、次のようにすることができます。

foo = buffer()
bar = foo.resize((50, 50))
del foo

または同等に:

bar = buffer().resize((50, 50))

bufferこれらは両方とも、このコードが実行されるとすぐにガベージコレクションの結果を利用できるようにします。

また、この場合、変数名を再利用することは完全に合理的です-コード内で行がすぐに次々にある場合、特にfoo.resizefooと同じタイプのオブジェクトを返す場合(そう思われるように)、次のようになります。

foo = buffer
foo = foo.resize((50, 50))

完全に大丈夫です。アドバイスは、完全に無関係な変数の名前を再利用しないことです。これにより、コードを読んでいる人が変数を確認し、最初に割り当てられた場所までスキップして、変数が何であるかを理解できます。それらの1つが、気になる実際のオブジェクトを取得するための1回限りの「踏み石」である場合、読者を混乱させるリスクはわずかです。

于 2012-11-12T08:43:42.930 に答える