web-dev-qa-db-ja.com

日時オブジェクトを深くコピーする必要がありますか?

そのため、先週、実験を実行して、高レベル言語であるにもかかわらず、次のように変数を割り当てるだけで変数のコピーを作成できることに気付きました。

a = 5    
b = a
print(b) # 5
b = 3
print(b) # 3
print(a) # 5

...辞書を処理したり、場合によってはリストを同じように扱ったりすると、うまく行きません!先週、辞書が同じように機能すると考えて、コードにバグを作成しました。適切で詳細なコピーを作成するには、以下を実行する必要があることがわかりました。

b = dict(a)

とにかく、私はdatetimeオブジェクトで忙しくて、それらが整数であるかのようにそれらをあちこち操作しています、今これが大丈夫かどうかについて少し緊張し始めています。動作する場所と動作しない場所は少しall意的に思えますが、動作を確認するためだけに毎回実験を実行する必要がありますか?文字列はおそらく整数のように機能すると推測できますが、動作がどこで変わるかはわかりません。

誰かを見ることができます 尋ねられました this PHP but for Python datetimeオブジェクトの割り当ては適切で深いコピーであり、元の変数を誤って混乱させることはありません。

14
cardamom

すべての datetimeモジュールで使用可能なタイプimmutableとして文書化されているため(クラスの文書化の直後に記載されています):

これらのタイプのオブジェクトは不変です。

これについて心配する必要はありません。

日時インスタンスの操作は新しいインスタンスを返すため、前のインスタンスを参照する他の名前には影響しません。

PM 2Ring 名前と値の仕組みに関する事実と神話 。これが混乱を明らかにするはずです。名前があります。

これについてarbitrary意的なことは何もありません。

Pythonのすべての割り当ては参照です。割り当て時にコピーは行われません。

オブジェクトを変更する能力がある場合、変更はそのオブジェクトへのすべての参照に自然に影響します。

元のコードの整数または文字列でこれが表示されない唯一の理由は、オブジェクトを変更せず、単に再割り当てするだけだからです。整数と文字列、および日時は、変更される方法がないため、できることはそれらを再割り当てすることだけです。リスト、辞書、または日時を再割り当てした場合、変更が他の参照に伝播されることもありません。

8
Daniel Roseman