[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
2022-03-15 21:31:30
質問
を使いながら
new_list = my_list
を変更した場合、その変更は
new_list
変更
my_list
を毎回使用します。これはなぜですか?また、これを防ぐにはリストをクローンまたはコピーすればよいのですか?
解決方法は?
と
new_list = my_list
のように、実際には2つのリストがあるわけではありません。代入はリストへの参照をコピーするだけで、実際のリストではありません。
new_list
と
my_list
は、代入後の同じリストを参照します。
実際にリストをコピーするには、さまざまな方法があります。
-
内蔵の
list.copy()
メソッド (Python 3.3 以降で利用可能) を使用します。new_list = old_list.copy()
-
スライスすることができます。
new_list = old_list[:]
アレックス・マルテッリ氏の の意見(少なくとも 2007年当時 ということです。 は奇妙な構文であり、これを使用することは意味がありません。 . ;) (彼の意見では、次のものの方が読みやすいそうです)。
-
内蔵の
list()
関数を使用します。new_list = list(old_list)
-
を使用することができます。
copy.copy()
:import copy new_list = copy.copy(old_list)
よりも少し遅いです。
list()
のデータ型を調べなければならないからです。old_list
を先に指定します。 -
リストにオブジェクトが含まれていて、それらもコピーしたい場合は、汎用的な
copy.deepcopy()
:import copy new_list = copy.deepcopy(old_list)
明らかに最も遅く、最もメモリを必要とする方法ですが、避けられない場合もあります。
例
import copy
class Foo(object):
def __init__(self, val):
self.val = val
def __repr__(self):
return 'Foo({!r})'.format(self.val)
foo = Foo(1)
a = ['foo', foo]
b = a.copy()
c = a[:]
d = list(a)
e = copy.copy(a)
f = copy.deepcopy(a)
# edit orignal list and instance
a.append('baz')
foo.val = 5
print('original: %r\nlist.copy(): %r\nslice: %r\nlist(): %r\ncopy: %r\ndeepcopy: %r'
% (a, b, c, d, e, f))
結果
original: ['foo', Foo(5), 'baz']
list.copy(): ['foo', Foo(5)]
slice: ['foo', Foo(5)]
list(): ['foo', Foo(5)]
copy: ['foo', Foo(5)]
deepcopy: ['foo', Foo(1)]
関連
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] scpを使ってリモートからローカルにフォルダをコピーするにはどうしたらいいですか?
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] ディープクローンオブジェクト
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み] リストの変更が不意にサブリスト全体に反映されたリスト
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Pythonの@decoratorsについてまとめてみました。
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み] python list by value not by reference [duplicate] (参照ではなく値によるリスト)