python中关于赋值,深浅拷贝

赋值

相当于同一块内存地址贴上了不同的标签。
比如 a=10,b=a;a和b就是'10'所在内存地址的不同标签而已。

浅拷贝 简单理解就是以下规则

浅拷贝的时候只拷贝第一层元素.
浅拷贝在修改第一层元素(不可变数据类型)的时候,拷贝出来的新列表不进行改变.
浅拷贝在替换第一层元素(可变数据类型)的时候,拷贝出来的新列表不进行改变.
浅拷贝在修改第一层元素中的元素(第二层)的时候,拷贝出来的新列表进行改变.
下面给出一些例子:

lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst1[-1].append(8)
print(lst)
print(lst1)
输出 [1, 2, 3, [5, 6, 7, 8]]
     [1, 2, 3, [5, 6, 7, 8]]
    
lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst[3] = 567
print(lst1)
print(lst)
输出 [1, 2, 3, [5, 6, 7]]
      [1, 2, 3, 567]


lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy()  #  [1,2,3,4,[5,6,7,[8,9]],10]
lst1.append(10)
print(lst)
print(lst1)
输出 [1, 2, 3, 4, [5, 6, 7, [8, 9]]]
     [1, 2, 3, 4, [5, 6, 7, [8, 9]], 10]

lst = [1,2,3,4,[5,6,7,[8,9,]]]
lst1 = lst.copy()
lst[-1][-1] = 56
print(lst)
print(lst1)
输出  [1, 2, 3, 4, [5, 6, 7, 56]]
       [1, 2, 3, 4, [5, 6, 7, 56]]
    
lst = [[1,2,],90,6,7,[5,6]]
lst1 = lst.copy()
lst1[-1] = 8
print(lst)
print(lst1)
输出  [[1, 2], 90, 6, 7, [5, 6]]
      [[1, 2], 90, 6, 7, 8]
    
dic = {"jerry":[1,2,3,[5,6]]}
dic1 = dic.copy()
dic["jerry"][0] = "56"
print(dic)
print(dic1)
输出 {'jerry': ['56', 2, 3, [5, 6]]}
     {'jerry': ['56', 2, 3, [5, 6]]}

深拷贝

深拷贝开辟一个容器空间(列表),不可变数据公用,可变数据数据类型(再次开辟一个新的空间)

import copy
lst = [1,2,3,[5,6,7]]
lst1 = copy.deepcopy(lst)  # 深拷贝
lst[-1].append(8)
print(lst)
print(lst1)
#输出 [1, 2, 3, [5, 6, 7, 8]]
     [1, 2, 3, [5, 6, 7]]
    
    
lst = [1,2,3,[5,6,7,[8,10,9]]]
import copy
ls1 = copy.deepcopy(lst)
print(id(lst[-1][-1]))
print(id(lst1[-1][-1]))
#输出 1604930721864
     1604932258952
posted @ 2020-04-06 16:31  Jerry!  阅读(192)  评论(0编辑  收藏  举报