相关链接另一篇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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
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])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
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]))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
![]()
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]))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
![]()
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))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
![]()
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))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
![]()
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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
![]()
文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树科学计算基础软件包NumPyNumPy概述416632 人正在系统学习中
评论记录:
回复评论: