pythonでどのように多変数に連続して値を割り当てますか?


コードを見たら、次のようになります。

self.batch_size = batch_size = 128
初一は不思議に思いますが、よく考えてみると合理的です。
pythonでは複数の変数を同時に宣言し、複数の変数に同じ初期値を付与する必要があります。次のようにして値を割り当てることができます。

a=b=c=1
ただし、ここでは、リストや辞書などの値が与えられている場合にも注意が必要です。

a=b=c=[1,2,3]
a、b、cは、コピーではなくリストを指すポインタで、他のものも変更されます。
例えば令a[1]=4であれば、b=[1,4,3]
python賦課とコピーは本当に分かりますか?
現象:まずコードを書きます。

>>> import copy
>>> a = [1,2,3,4,['a','b']]
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)
>>> a.append(5)
>>> print(a)
[1, 2, 3, 4, ['a', 'b'], 5]
>>> print(b)
[1, 2, 3, 4, ['a', 'b'], 5]
>>> print(c)
[1, 2, 3, 4, ['a', 'b']]
>>> print(d)
[1, 2, 3, 4, ['a', 'b']]
>>> a[4].append('c')
>>> print(a)
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print(b)
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print(c)
[1, 2, 3, 4, ['a', 'b', 'c']]
>>> print(d)
[1, 2, 3, 4, ['a', 'b']]######    ########
>>> id(a)44350024>>> id(b)44350024>>> id(c)44410440>>> id(d)44410760
一、概念(原理)
1、pythonの詳細な理解の中で値、copyとdeepcopyを付与する前に
私達はやはりpythonメモリの変数の保存状況を調べるために時間がかかります。
高度な言語では、変数はメモリとアドレスに対する抽象的なものです。pythonにとって、pythonのすべての変数は対象であり、変数の格納は、引用語義の方式を採用しており、格納されているのは変数の値があるメモリアドレスだけであり、この変数のそれ自体ではない。

2、賦課
pythonでは、オブジェクトの割り当ては簡単なオブジェクト参照です。これはC++とは違います。以下のとおりです

list_a = [1,2,3,"hello",["python","C++"]]
list_b = list_a
このような場合には、list_bとlist_aは同じです。彼らは同じメモリを指します。bはリストにすぎないですaの別名は、引用である。
私たちはリストを使うことができます。b is list_aで判断して、trueに戻ります。住所は同じで、内容は同じです。id(x)for x in list_も使用できます。a,list_bは二人のリストの住所を確認します。
割り当て操作(パラメータ、戻り値としてオブジェクトを含む)は新しいメモリ空間を開けません。新しいオブジェクトの参照をコピーしただけです。つまり、リストを除いてbこの名前以外に、他のメモリオーバーヘッドがありません。
リストを修正しましたa、list_に影響しました。b;同じように、list_を修正しました。bはリストに影響しますaです。
3、コピーが浅い
浅いコピーは新しいオブジェクトを作成します。その内容は元のオブジェクトの参照です。
浅いコピーは三つの形式があります。切片操作、工場関数、copyモジュールのcopy関数です。
例えば上記のリストに対してa,
スライス操作:list_b=list_a[:]またはlist_b=[each for each in list_]a)
工場関数:list_b=list(list_)a)
copy関数:list_b=copy.co py(list_)a)
浅いコピーでできたlist_bはもうリストではないですaを使って、isを使って彼らが同じ対象ではないことを発見することができて、idを使って調べて、それらも同じメモリを指しないことを発見します。でも、私達がid(x)for x in list_を使う時にaとid(x)for x in list_bの場合、両方の要素の住所は同じであることが見られます。
このような状況において、list_aとlist_bは異なる対象で、list_を修正する。b理論上はlist_に影響しないaです。例えばlist_b.apped([4,5])
ただし、浅いコピーを薄いコピーと呼ぶのは、層だけをコピーしたもので、list_である。aの中にネストされたリストがあります。それを修正したら状況が違います。
リスト.a[4].apped(「C」)リストを確認しますb、あなたはリストを発見します。bも変わった。これは、入れ子のリストを修正したからです。外側の要素を変更すると、他の場所を指し、ネストリストの要素を変更し、リストのアドレスを変更して変化させます。同じ位置を指します。
4、ディープコピー
深度コピーは一つの形式しかありません。copyモジュールのdeepcopy関数です。
浅いコピーに対応して、オブジェクトのすべての要素を深くコピーして、多層ネストの要素を含みます。そのため、時間と空間のオーバーヘッドは高いです。
同じリストにa、list_を使用するとb=copy.deepcopy(list_)a)list_を再修正するbはlist_に影響しません。aです。ネストされたリストがより深いレベルを持っていても、深くコピーされたオブジェクトはまったく新しいオブジェクトであり、元のオブジェクトとは何の関連もないからです。

二、コピーに関する警告
1、非容器タイプについては、数字、文字、その他の「原子」タイプのコピー説がない。発生したのはすべて元のオブジェクトの参照です。
2、タプル変数値に原子型オブジェクトが含まれている場合、深くコピーしても、浅いコピーしか得られません。
以上は個人の経験ですので、参考にしていただければと思います。