Python语法学习记录(9):list浅拷贝问题解析

文章目录

  • 一、列表浅拷贝演示
    • 列表的浅拷贝的产生
    • 列表的浅拷贝的检查
    • 什么样的操作会继续共享浅拷贝
    • 什么样的操作会破坏共享浅拷贝
  • 二、列表乘法所带来的浅拷贝
  • 三、二维乘法操作带来横向浅拷贝
  • 四、二维乘法操作所带来纵向浅拷贝

一、列表浅拷贝演示

列表的浅拷贝的产生

列表的浅拷贝的检查

什么样的操作会继续共享浅拷贝

什么样的操作会破坏共享浅拷贝

#============================================================================
#针对列表进行append,remove等操作不会破坏浅拷贝两个列表一同更新
#针对列表中间元素进行复制,不会破坏浅拷贝 两个列表一同更新
#针对中间一个列表进行复制  会重新设置id   破坏浅拷贝   之后两个列表无关 
print("===="*5,"等于所带来浅拷贝")
list1 = [1,2,3]
list2 = list1
print("after  =    ======")
print("打印list1:",list1)
print("打印list2:",list2)
print("List1地址:",id(list1))
print("List2地址:",id(list2))
list1.remove(3)  
print("after remove=====")
print("打印list1:",list1)
print("打印list2:",list2)
print("List1地址:",id(list1))
print("List2地址:",id(list2))
list1.append(3)
print("after append=====")
print("打印list1:",list1)
print("打印list2:",list2)
print("List1地址:",id(list1))
print("List2地址:",id(list2))
list1[1] = 0
print("after ele init ==")
print("打印list1:",list1)
print("打印list2:",list2)
print("List1地址:",id(list1))
print("List2地址:",id(list2))
list1[1] = [3,4]
print("after ele init ==")
print("打印list1:",list1)
print("打印list2:",list2)
print("List1地址:",id(list1))
print("List2地址:",id(list2))
list1[0] = [1,2]
print("after ele init ==")
print("打印list1:",list1)
print("打印list2:",list2)
print("List1地址:",id(list1))
print("List2地址:",id(list2))
list1 = [1,2,3,4]#重新赋值时候浅拷贝无效  id change
print("after list init ==")
print("打印list1:",list1)
print("打印list2:",list2)
print("List1地址:",id(list1))
print("List2地址:",id(list2))

Python语法学习记录(9):list浅拷贝问题解析_第1张图片

二、列表乘法所带来的浅拷贝

#针对列表的乘法后赋值不会升维度
#针对列表的乘法后在外面加上[]就会升维度
#第二种乘法会有浅拷贝  相同列表经过乘法作为被赋值列表的重复元素
print("===="*5,"一维乘法操作所带来浅拷贝")
list1 = [1,2,3]
print("打印list1:",list1)
#一个列表的所有元素所能索引到的id是不一样的
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1 = [0]*3
print("打印list1:",list1)
#乘法之后一个列表的所有数组所能索引到的id是一样的
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1[0] = 1
#此处如上元素之间地址相同但是对某一个元素重新赋值就会破坏浅拷贝
#因为元素已经是最小单位,一经赋值就会破坏浅拷贝
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1 = [1,2,3]*3
print("打印list1:",list1)
#乘法之后一个列表的所有数组所能索引到的id是一样的
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1[0] = 100
#此处如上元素之间地址相同但是对某一个元素重新赋值就会破坏浅拷贝
#因为元素已经是最小单位,一经赋值就会破坏浅拷贝
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))

Python语法学习记录(9):list浅拷贝问题解析_第2张图片

三、二维乘法操作带来横向浅拷贝

print("===="*5,"二维乘法操作所带来横向浅拷贝")
#针对列表进行append,remove等操作不会破坏浅拷贝两个列表一同更新
#针对列表中间元素进行复制,不会破坏浅拷贝 两个列表一同更新
#针对浅拷贝中间一个列表进行复制  会重新设置id   破坏浅拷贝   之后两个列表无关 
list1 = [[0]]*3
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1[0].append(1)
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1[0][0] = 100
#针对列表中间元素进行复制,不会破坏浅拷贝 两个列表一同更新
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1[0] = 100
#针对浅拷贝中间一个列表进行复制  会重新设置id   破坏浅拷贝   之后两个列表无关 
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))

Python语法学习记录(9):list浅拷贝问题解析_第3张图片

四、二维乘法操作所带来纵向浅拷贝

print("===="*5,"二维乘法操作所带来纵向浅拷贝")
list1 = [[0]*2]*3
#横向间为元素的赋值  可以看作没有浅拷贝  纵向间可以看作有浅拷贝
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1[0].append(3) 
print("打印list1:",list1)
list1[1][1] = [1,2] #对浅拷贝内的元素进行重新复制可行
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0][1]))
print("List1[1]地址:",id(list1[1][1]))
print("List1[2]地址:",id(list1[2][1]))
list1[1][1][0] = 0 #对浅拷贝内的元素进行重新复制可行
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0][1]))
print("List1[1]地址:",id(list1[1][1]))
print("List1[2]地址:",id(list1[2][1]))
list1[0][1] = 100 #对浅拷贝内的元素进行重新复制可行
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))
list1[0] = 100 #对浅拷贝列表重新赋值时候浅拷贝无效
#对整个列表进行append等list函数以外的赋值操作则地址会改变 浅拷贝就不存在了
print("打印list1:",list1)
print("List1[0]地址:",id(list1[0]))
print("List1[1]地址:",id(list1[1]))
print("List1[2]地址:",id(list1[2]))

Python语法学习记录(9):list浅拷贝问题解析_第4张图片

你可能感兴趣的:(Python语法编程)