※この記事はUdemyの
「現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル」
の講座を受講した上での、自分用の授業ノートです。
講師の酒井潤さんから許可をいただいた上で公開しています。
■リストを代入した場合の挙動
list_copy
x = [1, 2, 3, 4, 5]
y = x
y[0] = 100
print('x = ', x)
print('y = ', y)
result
x = [100, 2, 3, 4, 5]
y = [100, 2, 3, 4, 5]
x
をいじっただけなのに、y
にまで変更が及んでしまう。
list_copy
x = [1, 2, 3, 4, 5]
y = x.copy()
y[0] = 100
print('x = ', x)
print('y = ', y)
result
x = [1, 2, 3, 4, 5]
y = [100, 2, 3, 4, 5]
x
の代わりにx.copy()
とすることで、
「x
そのもの」ではなく「x
のコピー」をy
に代入することができる。
■なぜ影響が及んだのか
◆別のid
id_different
X = 20
Y = X
Y = 5
print('X = ', X)
print('Y = ', Y)
print('id of X =', id(X))
print('id of Y =', id(Y))
result
X = 20
Y = 5
id of X = 4364961520
id of Y = 4364961040
リストではなく、数値で同様にしてみると、Y
を書き換えてもX
には影響が出ない。
id()
を使って、X
とY
のidをみてみると、それぞれ別のidとなっていることが確認できる。
◆同じid
id_same
X = ['a', 'b']
Y = X
Y[0] = 'p'
print('X = ', X)
print('Y = ', Y)
print('id of X =', id(X))
print('id of Y =', id(Y))
result
X = ['p', 'b']
Y = ['p', 'b']
id of X = 4450177504
id of Y = 4450177504
リストではY
の書き換えにより、X
にも影響が出ている。
この場合idをみてみると、X
もY
も同じidをさしていることがわかる。
id_same
X = ['a', 'b']
Y = X.copy()
Y[0] = 'p'
print('X = ', X)
print('Y = ', Y)
print('id of X =', id(X))
print('id of Y =', id(Y))
result
X = ['a', 'b']
Y = ['p', 'b']
id of X = 4359291360
id of Y = 4359293920
.copy()
により回避した場合は、
X
とY
のidが異なっていることがわかる。