[解決済み] for'ループでi = i + 1とi += 1の違いは何ですか?[重複しています]。
質問
今日、不思議なことを発見したのですが、どなたかこの違いについて教えていただけませんか?
import numpy as np
A = np.arange(12).reshape(4,3)
for a in A:
a = a + 1
B = np.arange(12).reshape(4,3)
for b in B:
b += 1
を実行した後、それぞれの
for
のループになります。
A
は変更されていませんが
B
は、各要素に1つずつ追加されています。実際に使っているのは
B
の中で初期化されたNumPyの配列に書き込むためのバージョンです。
for
のループになります。
どのように解決するのですか?
違いは、データ構造そのものを変更する場合(インプレース操作)です。
b += 1
であるのに対し、もう一方は
再割り当て
変数
a = a + 1
.
念のため。
x += y
は
常に
がインプレース操作を行う場合、(少なくとも)3つの例外があります。
-
もし
x
は実装されていません。 アン__iadd__
メソッドを使用する場合x += y
文は、単にx = x + y
. これは、次のような場合です。x
のようなものでした。int
. -
もし
__iadd__
を返します。NotImplemented
にフォールバックし、Pythonはx = x + y
. -
は
__iadd__
メソッドは、理論的にはそのままでは動作しないように実装することができます。そんなことしたら、本当に気持ち悪いですけどね。
たまたまあなたの
b
は
numpy.ndarray
を実装している
__iadd__
を作成し、それ自体を返すので、2回目のループでは元の配列をインプレースで変更します。
これについては Python documentation of "Emulating Numeric Types" .
<ブロッククオート
これらの [...
__i*__
] メソッドは、拡張された算術代入を実装するために呼び出されます (
+=
,
-=
,
*=
,
@=
,
/=
,
//=
,
%=
,
**=
,
<<=
,
>>=
,
&=
,
^=
,
|=
). これらのメソッドは、インプレースで操作を行い(selfを変更)、その結果(selfである可能性もあるが、そうである必要はない)を返そうとするはずである。特定のメソッドが定義されていない場合、拡張された代入は通常のメソッドにフォールバックします。例えば、x がクラスのインスタンスで
__iadd__()
メソッドを使用します。
x += y
と同じです。
x = x.__iadd__(y)
. それ以外の場合は
x.__add__(y)
と
y.__radd__(x)
の評価と同様、考慮されます。
x + y
. 特定の状況では,補強された代入は予期せぬエラーを引き起こすことがあります (
なぜ
a_tuple[i] += ["item"]
は、加算がうまくいったときに例外を発生させるのですか?
) が、実はこの動作はデータモデルの一部なのです。
関連
-
Python Decorator 練習問題
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み】Pythonで「i += x」と「i = i + x」が異なるのはどんなとき?