python 浅拷贝和深拷贝,赋值的例子

一、浅拷贝copy.copy()

数据半独立,看下面例子

1、一层列表,能够完全拷贝,和深拷贝一样的效果

import copy
alist
=[1,2,3] #id;2281268077504 blist=copy.copy(alist) # id: 2281267497216 alist.append(13) # 一层列表添加值后,alist的值:[1, 2, 3, 13]
# blist的值不变:[1, 2, 3]

2、嵌套列表,浅拷贝就只拷贝了外层数据,深层数据的内存id依旧是同一个

alist=[1,2,3,[8,9]]    #id(alist):1989637956864     id((alist[-1]) :1709628674816
blist=copy.copy(alist) # id(blist): 1989637933056  id((blist[-1])) :1709628674816  跟上面一样
 alist[-1].append(13) 

#给嵌套列表添加值后,alist的值:[1, 2, 3, [8, 9, 13]]
#
blist的子列表中值也跟着变化 :[1, 2, 3, [8, 9, 13]]

二、深拷贝copy.deepcopy()

数据完全独立,外层和深层数据的内存id均不一致

1、一层列表,同浅拷贝,略

2、嵌套列表,深拷贝不只拷贝外层,深层数据也拷贝,id也不一致

alist=[1,2,3,[8,9]]    #id;1989637956864   id((alist[-1]) :1709628674816
blist=copy.copy(alist) # id: 1989637933056  id((blist[-1])):1746552654016   跟上面不一样
alist[-1].append(13)

#给嵌套列表添加值后,alist的值:[1, 2, 3, [8, 9, 13]]
#
blist的子列表中值不会变化 :[1, 2, 3, [8, 9]]

三、赋值

外层和深层的内存id都一致

1、修改外层列表

alist=[1,2,3,[8,9]]    #id;3005312197888   子列表id:3005306530480
blist=alist            #id;3005312197888   子列表id:3005306530480
alist.append(13)  
#alist的值:[1, 2, 3, [8, 9], 13]
#blist的值:[1, 2, 3, [8, 9], 13]

2、修改子列表,内存id依旧完全一样

alist=[1,2,3,[8,9]]    #id;1729717527808   子列表id:1729718080384
blist=alist            #id;1729717527808   子列表id:1729718080384
alist[-1].append(13)  
#alist的值:[1, 2, 3, [8, 9, 13]]
#blist的值:[1, 2, 3, [8, 9, 13]]

 

posted @ 2023-04-05 14:14  七亿星空  阅读(31)  评论(0编辑  收藏  举报