LoginSignup
0
1

Python の浅いコピーと深いコピー

Last updated at Posted at 2023-08-26

はじめに

Python でオブジェクトをコピーした際にどこまで別オブジェクトとしてコピーされるかの整理です。

動作確認

コピーなし

# 共有渡し
# (同一オブジェクト)
x = ['1', ['2', '3']]
y = x
y[0] = 'A'
y[1][0] = 'B'

print(f'x = {x}')  # x = ['A', ['B', '3']]
print(f'y = {y}')  # y = ['A', ['B', '3']]

浅いコピー

# 浅いコピー 
# (第1階層('1')は別オブジェクトになるが第2階層以降(['2, '3])は同一オブジェクト)
x = ['1', ['2', '3']]
y = list(x)
y[0] = 'A'
y[1][0] = 'B'

print(f'x = {x}')  # x = ['1', ['B', '3']]
print(f'y = {y}')  # y = ['A', ['B', '3']]

深いコピー

# 浅いコピー 
#  (全オブジェクトが別オブジェクト)
import copy
x = ['1', ['2', '3']]
y = copy.deepcopy(x)
y[0] = 'A'
y[1][0] = 'B'

print(f'x = {x}')  # x = ['1', ['2', '3']]
print(f'y = {y}')  # y = ['A', ['B', '3']]

参考資料

おわりに

Pyhonに限ったことではありませんが、特に入れ子のオブジェクトの場合は、それぞれの階層のオブジェクトの値を変更した場合、代入元と代入先のそれぞれのオブジェクトの値がどのようになるのかを意識しないと痛い目に会いそうですね。

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1