python、numpy、pytorch中的浅拷贝和深拷贝

1、Python中的浅拷贝和深拷贝

import copy

a = [1, 2, 3, 4, [11, 22, 33, [111, 222]]]
b = a
c = a.copy()
d = copy.deepcopy(a)

print('before modify\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')
 before modify
 a=
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 
 b = a=
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 
 c = a.copy()=
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 
 d = copy.deepcopy(a)
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 

注:图片网址Python Tutor code visualizer: Visualize code in Python, JavaScript, C, C++, and Java

a[0] = 10
print('after a[0] = 10\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')
 after a[0] = 10
 a=
 [10, 2, 3, 4, [11, 22, 33, [111, 222]]] 
 b = a=
 [10, 2, 3, 4, [11, 22, 33, [111, 222]]] 
 c = a.copy()=
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 
 d = copy.deepcopy(a)
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 
a[4][0] = 100
print('after a[4][0] = 100\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')
after a[4][0] = 100
 a=
 [10, 2, 3, 4, [100, 22, 33, [111, 222]]] 
 b = a=
 [10, 2, 3, 4, [100, 22, 33, [111, 222]]] 
 c = a.copy()=
 [1, 2, 3, 4, [100, 22, 33, [111, 222]]] 
 d = copy.deepcopy(a)
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 
a[4][3][0] = 1000
print('after a[4][3][0] = 1000\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')
after a[4][3][0] = 1000
 a=
 [10, 2, 3, 4, [100, 22, 33, [1000, 222]]] 
 b = a=
 [10, 2, 3, 4, [100, 22, 33, [1000, 222]]] 
 c = a.copy()=
 [1, 2, 3, 4, [100, 22, 33, [1000, 222]]] 
 d = copy.deepcopy(a)
 [1, 2, 3, 4, [11, 22, 33, [111, 222]]] 

2、numpy中的浅拷贝和深拷贝

a1 = np.random.randn(2, 3)
b1 = a1
c1 = a1.copy()
d1 = copy.deepcopy(a1)

print('before modify\r\n a1=\r\n', a1, '\r\n',
      'b1 = a1=\r\n', b1, '\r\n',
      'c1 = a1.copy()=\r\n', c1, '\r\n',
      'd1 = copy.deepcopy(a1)=\r\n', d1, '\r\n')

a1[0] = 10
print('after a1[0] = 10\r\n a1=\r\n', a1, '\r\n',
      'b1 = a1=\r\n', b1, '\r\n',
      'c1 = a1.copy()=\r\n', c1, '\r\n',
      'd1 = copy.deepcopy(a1)=\r\n', d1, '\r\n')

before modify
 a1=
 [[ 1.48618757 -0.90409826  2.05529475]
 [ 0.14232255  2.93331428  0.88511785]] 
 b1 = a1=
 [[ 1.48618757 -0.90409826  2.05529475]
 [ 0.14232255  2.93331428  0.88511785]] 
 c1 = a1.copy()=
 [[ 1.48618757 -0.90409826  2.05529475]
 [ 0.14232255  2.93331428  0.88511785]] 
 d1 = copy.deepcopy(a1)=
 [[ 1.48618757 -0.90409826  2.05529475]
 [ 0.14232255  2.93331428  0.88511785]] 
after a1[0] = 10
 a1=
 [[10.         10.         10.        ]
 [ 0.14232255  2.93331428  0.88511785]] 
 b1 = a1=
 [[10.         10.         10.        ]
 [ 0.14232255  2.93331428  0.88511785]] 
 c1 = a1.copy()=
 [[ 1.48618757 -0.90409826  2.05529475]
 [ 0.14232255  2.93331428  0.88511785]] 
 d1 = copy.deepcopy(a1)=
 [[ 1.48618757 -0.90409826  2.05529475]
 [ 0.14232255  2.93331428  0.88511785]] 

  3、pytorch中的浅拷贝和深拷贝

a2 = torch.randn(2, 3)
b2 = torch.Tensor(a2)
bb2 = torch.tensor(a2)
c2 = a2.detach()
cc2 = a2.clone()
ccc2 = a2.clone().detach()
print('before modify\r\n a2=\r\n', a2, '\r\n',
      'b2 = torch.Tensor(a2)=\r\n', b2, '\r\n',
      'bb2 = torch.tensor(a2)=\r\n', bb2, '\r\n',
      'c2 = a2.detach()=\r\n', c2, '\r\n',
      'cc2 = a2.clone()=\r\n', cc2, '\r\n',
      'ccc2 = a2.clone().detach()=\r\n', ccc2)
a2[0] = 0
print('after modify\r\n a2=\r\n', a2, '\r\n',
      'b2 = torch.Tensor(a2)=\r\n', b2, '\r\n',
      'bb2 = torch.tensor(a2)=\r\n', bb2, '\r\n',
      'c2 = a2.detach()=\r\n', c2, '\r\n',
      'cc2 = a2.clone()=\r\n', cc2, '\r\n',
      'ccc2 = a2.clone().detach()=\r\n', ccc2)

before modify
 a2=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]]) 
 b2 = torch.Tensor(a2)=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]]) 
 bb2 = torch.tensor(a2)=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]]) 
 c2 = a2.detach()=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]]) 
 cc2 = a2.clone()=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]]) 
 ccc2 = a2.clone().detach()=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]])
after modify
 a2=
 tensor([[ 0.0000,  0.0000,  0.0000],
        [ 0.8979, -0.4158,  1.1338]]) 
 b2 = torch.Tensor(a2)=
 tensor([[ 0.0000,  0.0000,  0.0000],
        [ 0.8979, -0.4158,  1.1338]]) 
 bb2 = torch.tensor(a2)=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]]) 
 c2 = a2.detach()=
 tensor([[ 0.0000,  0.0000,  0.0000],
        [ 0.8979, -0.4158,  1.1338]]) 
 cc2 = a2.clone()=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]]) 
 ccc2 = a2.clone().detach()=
 tensor([[-0.6472,  1.3437, -0.3386],
        [ 0.8979, -0.4158,  1.1338]])

 参考

1、B站视频

十分钟!彻底弄懂Python深拷贝与浅拷贝机制_哔哩哔哩_bilibili

11、简书

NumPy之浅拷贝和深拷贝 - 简书 (jianshu.com)

2、CSDN-numpy

 numpy copy(无拷贝 浅拷贝、深拷贝)类型说明_genghaihua的博客-CSDN博客

3、CSDN-pytorch

python、pytorch中的常见的浅拷贝、深拷贝问题总结_pytorch tensor的浅、复制_新嬉皮士的博客-CSDN博客

完整代码

import numpy as np
import copy
import torch

a = [1, 2, 3, 4, [11, 22, 33, [111, 222]]]
b = a
c = a.copy()
d = copy.deepcopy(a)

print('before modify\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')

a[0] = 10
print('after a[0] = 10\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')

a[4][0] = 100
print('after a[4][0] = 100\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')

a[4][3][0] = 1000
print('after a[4][3][0] = 1000\r\n a=\r\n', a, '\r\n',
      'b = a=\r\n', b, '\r\n',
      'c = a.copy()=\r\n', c, '\r\n',
      'd = copy.deepcopy(a)\r\n', d, '\r\n')


a1 = np.random.randn(2, 3)
b1 = a1
c1 = a1.copy()
d1 = copy.deepcopy(a1)

print('before modify\r\n a1=\r\n', a1, '\r\n',
      'b1 = a1=\r\n', b1, '\r\n',
      'c1 = a1.copy()=\r\n', c1, '\r\n',
      'd1 = copy.deepcopy(a1)=\r\n', d1, '\r\n')

a1[0] = 10
print('after a1[0] = 10\r\n a1=\r\n', a1, '\r\n',
      'b1 = a1=\r\n', b1, '\r\n',
      'c1 = a1.copy()=\r\n', c1, '\r\n',
      'd1 = copy.deepcopy(a1)=\r\n', d1, '\r\n')


a2 = torch.randn(2, 3)
b2 = torch.Tensor(a2)
bb2 = torch.tensor(a2)
c2 = a2.detach()
cc2 = a2.clone()
ccc2 = a2.clone().detach()
print('before modify\r\n a2=\r\n', a2, '\r\n',
      'b2 = torch.Tensor(a2)=\r\n', b2, '\r\n',
      'bb2 = torch.tensor(a2)=\r\n', bb2, '\r\n',
      'c2 = a2.detach()=\r\n', c2, '\r\n',
      'cc2 = a2.clone()=\r\n', cc2, '\r\n',
      'ccc2 = a2.clone().detach()=\r\n', ccc2)
a2[0] = 0
print('after a2[0] = 0\r\n a2=\r\n', a2, '\r\n',
      'b2 = torch.Tensor(a2)=\r\n', b2, '\r\n',
      'bb2 = torch.tensor(a2)=\r\n', bb2, '\r\n',
      'c2 = a2.detach()=\r\n', c2, '\r\n',
      'cc2 = a2.clone()=\r\n', cc2, '\r\n',
      'ccc2 = a2.clone().detach()=\r\n', ccc2)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值