Python语法学习记录(19):numpy中浅拷贝和list中浅拷贝的异同

相关链接另一篇bolg讲述list中的浅拷贝问题
Python语法学习记录(9):list浅拷贝问题解析

1、numpy中浅拷贝的产生与判断方法

1.1 浅拷贝的产生

一般通过直接 = 赋值产生

1.2 通过两种方式进行浅拷贝的判断

1.2.1 查询存储路径判断浅拷贝

查看每一个的存储编号,如果相同就是存在浅拷贝因为指向相同的位置,变量名字只是用来索引到那个存储位置,改变任何一个变量名下面的内容,都会让那个存储位置内容改变,导致其他存在浅拷贝关系的变量名下面的内容也发生改变。

1.2.2 通过is函数判断是否一样判断浅拷贝

is函数原理和id原理近似

import numpy as np
a = np.arange(4)
b = a
c = a
d = b
# 查看每一个的存储编号  
print(id(a))
print(id(b))
print(id(c))
print(id(d))
# 浅拷贝的现象  更改一个变量  相关浅拷贝变量都会改变
print(a)
a[0] = 11
print(a)
print(b)
print(c)
print(d)
# 通过is() 判断浅拷贝
print(b is a)  
print(c is a) 
print(d is a)

2、规避浅拷贝的方法

通过copy的方法进行无浅拷贝的等价于复制的赋值

import numpy as np

a = np.arange(4)
print("a:",a)
b = a.copy()    # deep copy
print("b:",b)        # array([11, 22, 33,  3])
print(id(a))
print(id(b))
a[3] = 44
print(a)        # array([11, 22, 33, 44])
print(b)        # array([11, 22, 33,  3])

3、numpy中变量部分浅拷贝的问题

当将矩阵的部分内容进行赋值的时候也会产生浅拷贝,这个时候出现问题其实很难判断

下面介绍一下部分浅拷贝的问题和判断方法

a = np.array([1,2,3,4,5])
# 全变量的浅拷贝
b = a
print('a id',id(a))
print('b id',id(b))
print('a.shape',a.shape)
a[2] = 9
print('a ',a)
print('b ',b)
# 变量部分矩阵单元的浅拷贝
b = a[1:3]
print('a ',a)
print('b ',b)
print('b.shape ',b.shape)
b[0] = 100
print('a ',a)
print('b ',b)
print('a id',id(a))
print('a[0] id',id(a[0]))
print('a[1] id',id(a[1]))
print('a[2] id',id(a[2]))
print('a[3] id',id(a[3]))
print('a[4] id',id(a[4]))
print('a[0:3] id',id(a[0:3]))
print('a[1:3] id',id(a[1:3]))
print('a[2:3] id',id(a[2:3]))
print('b id',id(b))
print('b[0] id',id(b[0]))
print('b[1] id',id(b[1]))
a[2] =1000
print('a ',a)
print('b ',b)
print('a id',id(a))
print('a[0] id',id(a[0]))
print('a[1] id',id(a[1]))
print('a[2] id',id(a[2]))
print('a[3] id',id(a[3]))
print('a[4] id',id(a[4]))
print('a[1:3] id',id(a[1:3]))
print('b id',id(b))
print('b[0] id',id(b[0]))
print('b[1] id',id(b[1]))

a = np.ones((4,5))
# 全变量的浅拷贝
b = a
print('a id',id(a))
print('b id',id(b))
print('a.shape',a.shape)
a[1,3] = 9
print('a ',a)
print('b ',b)
# 变量部分矩阵单元的浅拷贝
b = a[1:3,1:4]
print('a ',a)
print('b ',b)
print('b.shape ',b.shape)
b[0,1] = 100
print('a ',a)
print('b ',b)
print('a id',id(a))
print('a[0] id',id(a[0])) # 结果和a[1],a[2],a[3]一样
print('a[0:3] id',id(a[0:3])) # 结果和a[1:3],a[2:3]一样
print('a[0:3,1] id',id(a[0:3,1])) # 结果和a[1:3],a[2:3]一样
print('a[1,0:3] id',id(a[1,0:3])) # 结果和a[1:3],a[2:3]一样
print('a[0,0] id',id(a[0,0]))
print('a[0,1] id',id(a[0,1])) 
print('a[0,2] id',id(a[0,2])) 
print('a[1,0] id',id(a[1,0]))
print('a[1,1] id',id(a[1,1])) 
print('a[1,2] id',id(a[1,2])) 
print('b id',id(b))
print('b[0] id',id(b[0]))
print('b[1] id',id(b[1]))
print('b[0,0] id',id(b[0,0]))

4、numpy切片浅拷贝和list切片浅拷贝中的区别

主要是在部分浅拷贝或者切片浅拷贝的时候保存机制不一样

import numpy as np
import sys

a = [[1,2,3,4],[5,6,7,8]]
b = a[0]
print('a[0] id 与 b id 是一样的')
print('a id',id(a))
print('a[0] id',id(a[0]))
print('b id',id(b))

print('浅拷贝中元素赋值,相关变量也一起改变')
a[0][0] = 9
print('a ',a)
print('b ',b)
print('a id',id(a))
print('a[0] id',id(a[0]))
print('b id',id(b))

a = [[1,2,3,4],[5,6,7,8]]
b = a[0]

print('浅拷贝整个变量重新赋值,相关变量指向原来的位置,所以不变,浅拷贝破坏')
print('a[0] id',id(a[0]))
print('b id',id(b))
a[0] = 100
print('a ',a)
print('b ',b)
print('a id',id(a))
print('a[0] id',id(a[0]))
print('b id',id(b))

print('与numpy中不同的这里对于切片或者部分的浅拷贝在后续赋值过程中会被破坏')
print('切片浅拷贝')
print('从id上看切片赋值浅拷贝是存在的,但是从is上看,改变赋值状态另一个却不变化了')
a = [1,2,3,4,5,6,7,8]
b = a[1:4]

print('a[2] id:', id(a[2]))
print('b[1] id:', id(b[1]))
print('     is',b is a[1:4])
print('     is',b[1] is a[2])
print('a:', a)
print('b:', b)

a[2] = 100
# b[1] = 100
print('=================')

print('a[2] id:', id(a[2]))
print('b[1] id:', id(b[1]))
print('     is',b is a[1:4])
print('     is',b[1] is a[2])
print('a:', a)
print('b:', b)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆象呆呆

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值