[解決済み] Pythonで複数の変数に同じ値を代入する? リストの動作
質問
変数の初期化に以下のような多重代入を使おうとしたのですが、動作に戸惑っています。
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
結果は [1, 3, 5] [1, 3, 5] [1, 3, 5]
複数回の割り当てには何を使用すればよいのでしょうか? これと何が違うのでしょうか?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
の結果です。 ('f:', 3) ('e:', 4)
どのように解決するのですか?
C/Java/などの言語からPythonに来た人は、以下のことを考えるのをやめるといいかもしれません。
a
をquot;変数"として、それをquot;名前"として考え始める。
a
,
b
および
c
は同じ値を持つ別の変数ではなく、同じ同じ値に対する別の名前なのです。変数には型、ID、アドレス、その他いろいろなものがあります。
名前にはそのようなものはありません。 値 もちろん、同じ値に対してたくさんの名前をつけることができます。
もしあなたが
Notorious B.I.G.
ホットドッグ,*
Biggie Smalls
そして
Chris Wallace
はホットドッグを持っています。の最初の要素を変更すると
a
の最初の要素を 1 にすると
b
と
c
は1である。
2つの名前が同じオブジェクトを命名しているかどうかを知りたい場合は
is
演算子を使用します。
>>> a=b=c=[0,3,5]
>>> a is b
True
その後、あなたはこう尋ねます。
これと何が違うのでしょうか?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
ここでは、名前を再バインドしています。
e
を値
4
. それは、名前に影響を与えません。
d
と
f
をどのような形であれ
前のバージョンでは、あなたは
a[0]
ではなく
a
. という点から
a[0]
を再バインドしています。
a[0]
の観点で、しかし
a
ということは、インプレースで変更していることになります。
を使用することができます。
id
この関数は、オブジェクトの ID を表す一意な番号を与えるものです。
is
はどうしようもない。
>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120
>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216
注目すべきは
a[0]
は4297261120から4297261216に変更されている。これは別の値の名前になっている。また
b[0]
もまた、同じ新しい値の名前になりました。それは
a
と
b
はまだ同じオブジェクトを命名しています。
アンダーザカバー
a[0]=1
は、実際にはリストオブジェクトのメソッドを呼び出しています。(これは
a.__setitem__(0, 1)
.) つまり、これは
本当に
をバインドしています。それはまるで
my_object.set_something(1)
. もちろん、このメソッドを実装するためにオブジェクトはインスタンス属性を再バインドしているのでしょうが、それは重要ではありません。重要なのは、何も代入していない、ただオブジェクトを変異させているだけだということです。そして、それは
a[0]=1
.
user570826さんからの質問です。
あればどうでしょう。
a = b = c = 10
と全く同じ状況です。
a = b = c = [1, 2, 3]
同じ値に対して3つの名前があります。
しかし、この場合、その値は
int
であり、かつ
int
はイミュータブルです。どちらの場合でも
a
を別の値に変更する(例.
a = "Now I'm a string!"
という元の値には影響を与えません。
b
と
c
はそのままの名前になります。違いは、リストでは、値を変更することで
[1, 2, 3]
を
[1, 2, 3, 4]
をすることで、例えば
a.append(4)
という値を変更することになります。
b
と
c
は名前です。
b
は今後
[1, 2, 3, 4]
. の値を変更する方法はありません。
10
を他の何かに変更します。
10
は永遠に10であり、吸血鬼のクローディアが永遠に5であるように(少なくともキルスティン・ダンストに取って代わられるまでは)。
* 警告 ノトーリアスB.I.G.にホットドッグを与えないでください。ギャングスタ・ラップ・ゾンビには、真夜中以降、決して食べ物を与えてはいけない。
関連
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] リストに値が存在するかどうかを確認する最速の方法
-
[解決済み] リストの要素を値で削除する簡単な方法はありますか?
-
[解決済み] Pythonでリストをファイルに書き込む
-
[解決済み] 複数の変数が1つの値に対して等しいかどうかをテストするには?
-
[解決済み] Pythonで一定の大きさの空リストを作成する
-
[解決済み】Pythonで辞書のキーをリストとして返すには?
最新
-
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サンプルコード
-
Python Decorator 練習問題
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Pythonの@decoratorsについてまとめてみました。
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] 複数の変数を同時に宣言する、よりエレガントな方法