Chapter 5.2, Lists and Mutability (リストと可変性)

<目次>


Immutable vs. Mutable (不変 vs 可変)


Definition (定義)


リスト参照を含むリスト(図5.1〜5.3)

図5.2: univs1はtechsリストとivysリストを参照しているので、techsリストを修正するとその影響を受ける。univs2は他のリストを参照していないので、影響を受けない。

# 2つのリスト techs, ivys を用意。
>>> techs = ['MIT', 'Caltech']
>>> ivys = ['Harvard', 'Yale', 'Brown']
# 別のリスト univs1, univs2 を用意。
# このうち univs1 は、先ほど用意したリストオブジェクト techs と ivys を要素とする。
# これに対し univs2 は、既存変数とは無関係に新しくstr型オブジェクトを列挙したリストを要素とする。
>>> univs1 = [techs, ivys]
>>> univs2 = [['MIT', 'Caltech'], ['Harvard', 'Yale', 'Brown']]
>>> univs1 == univs2
True
# 上記補足:
#  リスト同士の``==``は、「順番通りに保持している値が等しいか」だけを判定。
#  メモリ空間上は異なる部分を参照していても、保持している値が等しければ True になる。
>>> print(univs1)
[['MIT', 'Caltech'], ['Harvard', 'Yale', 'Brown']]
>>> print(univs2)
[['MIT', 'Caltech'], ['Harvard', 'Yale', 'Brown']]
# techs を編集(下記では techs[0] を違う値に変更)すると、
# techsリストを参照している univs1 にも影響が及ぶ。
>>> techs[0] = 'hoge'
>>> print(techs)
['hoge', 'Caltech']
>>> print(univs1)
[['hoge', 'Caltech'], ['Harvard', 'Yale', 'Brown']]
>>> print(univs2)
[['MIT', 'Caltech'], ['Harvard', 'Yale', 'Brown']]
# techs を編集(ここではtechsの後ろに新しいオブジェクトを追加)すると、
# techsリストを参照している univs1 にも影響が及ぶ。
>>> techs.append('RPI')
>>> techs
['hoge', 'Caltech', 'RPI']
>>> univs1
[['hoge', 'Caltech', 'RPI'], ['Harvard', 'Yale', 'Brown']]
>>> univs2
[['MIT', 'Caltech'], ['Harvard', 'Yale', 'Brown']]

リスト操作(図5.4)


リスト操作時の注意点(chap 5.2.1 cloning)

def remove_dups(list1, list2):
    for e1 in list1:
        if e1 in list2:
            list1.remove(e1)
 
l1 = [1, 2, 3, 4]
l2 = [1, 2, 5, 6]
remove_dups(l1, l2)
print(l1)
# -> 想定では[3,4]になって欲しいが、実際には[2, 3, 4]になってしまう。
def remove_dups(list1, list2):
    duplicate = list1[:]
    for e1 in list1:
        if e1 in list2:
            duplicate.remove(e1)
    return duplicate
 
l1 = [1, 2, 3, 4]
l2 = [1, 2, 5, 6]
result = remove_dups(l1, l2)
print(result)
print(l1)

リスト内包表記

squares = []
for x in range(1,7):
    squares.append(x**2)
 
print(squares)
# -> [1, 4, 9, 16, 25, 36]
squares = [x**2 for x in range(1,7)]
print(squares)
# -> [1, 4, 9, 16, 25, 36]


参考サイト