pythonは2つの変数値を交換するn種類の操作を実現します。
python 2つの変数値を交換します。
方法1:
方法3:(2つの変数だけで実現)
python交換の二つの価値のある方法はとても簡単です。つまり、a、b=b、a、一歩操作して二つの値を交換しました。なぜですか?
真実:
Pythonの変数は直接値を保存せず、メモリアドレスを参照するだけで変数を交換する場合は、参照先を交換するだけです。
まず次のプログラムを見てください。
一つのPythonのプログラムにはいくつかのコードブロックがあります。例えば、Pythonファイルはコードブロック、一つのクラス、一つの関数はコードブロックで、一つのコードブロックは実行のコンテキスト環境と一連のバイトコード命令に対応します。
disの役割
disモジュールは、主にバイトコードを解析するための内蔵モジュールであり、しばしば使用される方法はdis.dis(bytesource)であり、パラメータはコードブロックであり、このコードブロックに対応するバイトコード命令シーケンスを得ることができる。
コード出力結果
その中で前の12の結果だけを見ればいいです。(私のコンパイラで交換する行のコードは12行目です。)
主にROT_が見られます。TWO指令の功労:
python文書を見るとROT_があることが分かります。TWO(ソース1398行)、ROT_THREE(ソース1406行)、ROT_FOURのようなコマンドは、直接に
2つの変数、3つの変数、4つの変数の値を交換します。
python 3.4のソースコードの中で、ceval.cファイルを調べたら、次のように見えます。
変数の各初期化は、新しいスペースを開き、新しいコンテンツのアドレスを変数に割り当てます。下の図にとって、私達は繰り返してstr 1に値を割り当てて、実はメモリの中の変化は図のようです:
上の図から分かるように、str 1は繰り返し初期化過程において、str 1に記憶されている要素アドレスが'hello world'のアドレスから'new hello world'に変わったからです。
複雑なデータタイプに対しては、変数に対する内部の値の影響を変更します。
リスト内の要素に対していくつかの添削操作を行うと、lst 1リスト自体がリストアドレス全体に対して影響を与えることはなく、その内部要素のアドレス参照のみが変更される。
しかし、リストを再初期化すると、lst 1という変数にアドレスを付与し、元のリストのアドレスを上書きします。このとき、lst 1リストのメモリIDは変更されます。上のこの道理はすべての複雑なデータのタイプの中で使うのと同じです。
以上は個人の経験ですので、参考にしていただければと思います。
方法1:
c = 0
c= a
a= b
b= c
方法二:
a,b = b,a
これはpythonの基本的な方法です。方法3:(2つの変数だけで実現)
a = a+b
b = a-b
a = a-b
python二つの数値交換(浅析a、b=b、a原理)python交換の二つの価値のある方法はとても簡単です。つまり、a、b=b、a、一歩操作して二つの値を交換しました。なぜですか?
真実:
Pythonの変数は直接値を保存せず、メモリアドレスを参照するだけで変数を交換する場合は、参照先を交換するだけです。
まず次のプログラムを見てください。
import dis
def func(a,b):
a,b=b,a
print(a,b)
a=10
b=20
func(a,b)
dis.dis(func)
一般的には、Python文はいくつかのバイトコード命令に対応していますが、Pythonのバイトコードはアセンブリ命令のような中間言語です。しかし、バイトコード命令は一つのマシン命令(バイナリ命令)に対応するのではなく、一部分のCコードに対応しています。頻繁にコマンドを呼び出すコードを確認することで、プログラムの性能を確認します。一つのPythonのプログラムにはいくつかのコードブロックがあります。例えば、Pythonファイルはコードブロック、一つのクラス、一つの関数はコードブロックで、一つのコードブロックは実行のコンテキスト環境と一連のバイトコード命令に対応します。
disの役割
disモジュールは、主にバイトコードを解析するための内蔵モジュールであり、しばしば使用される方法はdis.dis(bytesource)であり、パラメータはコードブロックであり、このコードブロックに対応するバイトコード命令シーケンスを得ることができる。
コード出力結果
その中で前の12の結果だけを見ればいいです。(私のコンパイラで交換する行のコードは12行目です。)
主にROT_が見られます。TWO指令の功労:
python文書を見るとROT_があることが分かります。TWO(ソース1398行)、ROT_THREE(ソース1406行)、ROT_FOURのようなコマンドは、直接に
2つの変数、3つの変数、4つの変数の値を交換します。
python 3.4のソースコードの中で、ceval.cファイルを調べたら、次のように見えます。
TARGET(ROT_TWO) {
PyObject *top = TOP();
PyObject *second = SECOND();
SET_TOP(second);
SET_SECOND(top);
FAST_DISPATCH();
}
TARGET(ROT_THREE) {
PyObject *top = TOP();
PyObject *third = THIRD();
SET_SECOND(third);
FAST_DISPATCH();
}
添付:python値の交換変数の各初期化は、新しいスペースを開き、新しいコンテンツのアドレスを変数に割り当てます。下の図にとって、私達は繰り返してstr 1に値を割り当てて、実はメモリの中の変化は図のようです:
上の図から分かるように、str 1は繰り返し初期化過程において、str 1に記憶されている要素アドレスが'hello world'のアドレスから'new hello world'に変わったからです。
複雑なデータタイプに対しては、変数に対する内部の値の影響を変更します。
リスト内の要素に対していくつかの添削操作を行うと、lst 1リスト自体がリストアドレス全体に対して影響を与えることはなく、その内部要素のアドレス参照のみが変更される。
しかし、リストを再初期化すると、lst 1という変数にアドレスを付与し、元のリストのアドレスを上書きします。このとき、lst 1リストのメモリIDは変更されます。上のこの道理はすべての複雑なデータのタイプの中で使うのと同じです。
以上は個人の経験ですので、参考にしていただければと思います。