

次の2つのpythonコードの挙動の違いについて理解できず、困っています。  
次のプログラムはタプルのリストの二重ループに対し、要素の大小を比較して入れ替えるプログラムです

[code]

    pair = [(1, 1), (3, 2), (2, 2) ]
    for a1,b1 in pair:
        for a2,b2 in pair:
            print( a1,b1,'-', a2,b2)
            if a1>a2:
                a1,a2 = a2,a1
            if b1>b2:
                b1,b2 = b2,b1
    print( pair )
    
    結果
    1 1 - 1 1
    1 1 - 3 2
    1 1 - 2 2
    3 2 - 1 1
    1 1 - 3 2
    1 1 - 2 2
    2 2 - 1 1
    1 1 - 3 2
    1 1 - 2 2
    [(1, 1), (3, 2), (2, 2)]
    
[/code]

一方で中間の変数をa1,a2,b1,b2を別の変数にコピーして同じを処理をすると、ループの巡り方が全く変わります。

[code]

    pair = [(1, 1), (3, 2), (2, 2)]
    for a1,b1 in pair:
        for a2,b2 in pair:
            ca1,ca2,cb1,cb2 = a1,a2,b1,b2
            print( ca1,cb1,'-',ca2,cb2 )
            if ca1>ca2:
                ca1,ca2 = ca2,ca1
            if cb1>cb2:
                cb1,cb2 = cb2,cb1
    print( pair )
    
    結果
    1 1 - 1 1
    1 1 - 3 2
    1 1 - 2 2
    3 2 - 1 1
    3 2 - 3 2
    3 2 - 2 2
    2 2 - 1 1
    2 2 - 3 2
    2 2 - 2 2
    [(1, 1), (3, 2), (2, 2)]
    
[/code]

処理後にいずれもリストpairについて破壊的な変更は行われていませんが、ループ中での挙動では変数の直接入れ替えた場合、リストのループの挙動が変更されているように見えます。

今のところa1,a2,b1,b2あるいはca1,ca2,cb1,cb2の各変数のいずれもがpairのタプルの各要素への参照を保持していて、入れ替えではその「変数への参照」そのものを入れ替えており、pairそのものは変更されずに保持されている、と理解していますが、なぜリストのループの挙動が一方では代わり、一方では変わらないのでしょうか。

何かヒントがありましたら、ご教授いただけますと幸いです。


CC BY-SA 4.0
2023-02-25T06:00:30.147
93995
2023-02-25T06:00:30.147
57263
question
python
リストのループにおける要素入れ替えの挙動について