1

このコードがあります:

>>> (a, b) = (2, 3)
>>> a
2
>>> b
3

タプルの作成後に変数abが有効なのはなぜですか?私はここでそれを意味します:

(a, b) = (2, 3)

はいくつかのタプルを作成し、このタプルはどの変数にも割り当てられていないため、ガベージコレクターはこの行の後でこのタプルをすぐに破棄する必要があります。

変数abは、このタプルによる参照のみです。したがって、このタプル(a、b)が破棄された場合、変数abも破棄される必要があります。

では、なぜこれらの変数はタプルの定義後にまだ存在しているのでしょうか?

4

2 に答える 2

4
(a, b) = (2, 3)

タプルを作成しませんが、2つの変数aとを割り当てますb

これは次と同等です。

a,b = 2,3

とセットa=2b=3「同時に」。これは、たとえば変数を切り替えるときに役立ちます。

a,b = b,a

これは設定されa=3ますb=2(そして、順番に実行される場合は一時変数が必要になります)。

于 2012-09-08T10:44:05.880 に答える
3

パーサーは(a, b)タプルとは見なされませんが、タプルの解凍は行います。したがって、破壊するどころか、作成するタプルはありません。a代わりに、Pythonはこれを2つの別個の変数とと見なしますb

ステートメントのコンパイル済みバイトコードを逆アセンブルすると、次のことがわかります。

>>> import dis
>>> def foo():
...     (a, b) = (2, 3)
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               3 ((2, 3))
              3 UNPACK_SEQUENCE          2
              6 STORE_FAST               0 (a)
              9 STORE_FAST               1 (b)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE        

定数(2, 3)は解凍され、ローカル変数aとに格納されますb

于 2012-09-08T10:43:57.697 に答える