标签:就是 行修改 改变 不可变类 浅拷贝 tee 地址 另一个 需要
2.以下使用列表list1 = [ "str", 123, [111,222]]
拷贝来进行实验
list2 = list1
??创建一个列表,包含字符串,整形和列表(可变),并将其赋值给另一个变量名
list1 = ["str", 123, [111,222]]
list2 = list1
??查看两个列表的"id",可以发现"id"不变,是同一个
print(id(list1)) #2248006456392
print(id(list2)) #2248006456392
print(id(list1[0]),id(list1[1]),id(list1[2]))
# 2248006252720 140725163491392 2248006455880
print(id(list2[0]),id(list2[1]),id(list2[2]))
# 2248006252720 140725163491392 2248006455880
??当改变"list1"内的第一或者第二个元素(不可变元素)
list1[0] = "aaa"
print(list1[0],id(list1[0]))
# aaa 2248007720496
print(list2[0],id(list2[0]))
# aaa 2248007720496
??发现"list1"改变的值的内存地址已经变化了,说明是产生的新值,与原来的"str"取消了对应
??而"list2"中的值和"id"也跟着改变
??当改变子列表里面的值时
list1[2][0] = 333
print(list1[2],id(list1[2]))
# [333, 222] 2248006455880
print(list2[2],id(list2[2]))
# [333, 222] 2248006455880
??我们发现两个列表的值都发生了改变,但子列表的"id"还都是不变的
list2 = list1.copy()
??创建一个列表,包含字符串,整形和列表(可变),并将其浅拷贝
list1 = ["str", 123, [111,222]]
list2 = list1.copy()
??查看两个列表的"id",可见是产生了新的一个内存地址
print(id(list1)) #2243511014472
print(id(list2)) #2243541368584
print(id(list1[0]),id(list1[1]),id(list1[2]))
# 2243510810800 140725163491392 2243511013960
print(id(list2[0]),id(list2[1]),id(list2[2]))
# 2243510810800 140725163491392 2243511013960
??复制过来的元素内存地址都是同一个,说明复制的只是变量名与内存地址的对应关系,指向的是同一个内存地址
??当改变"list1"内的第一或者第二个元素(不可变元素)
list1[0] = "aaa"
print(list1[0],id(list1[0]))
# aaa 2240322768432
print(list2[0],id(list2[0]))
# str 2243510810800
??发现"list1"改变的值的内存地址已经变化了,说明是产生的新值,与原来的"str"取消了对应
??而"list2"中的值和"id"都没变,说明还是原来的对应关系
??当改变子列表里面的值时
list1[2][0] = 333
print(list1[2],id(list1[2]))
# [333, 222] 2243511013960
print(list2[2],id(list2[2]))
# [333, 222] 2243511013960
??我们发现两个列表的值都发生了改变,但子列表的"id"还都是不变的
import copy
,copy.deepcopy(list)
??导入模块
import copy
??创建一个列表,包含字符串,整形和列表(可变),并将其深拷贝
list1 = ["str", 123, [111,222]]
list2 = copy.deepcopy(list1)
??查看两个列表的"id",可见是产生了新的一个内存地址
print(id(list1)) #2655395993736
print(id(list2)) #2655397313096
print(id(list1[0]),id(list1[1]),id(list1[2]))
# 2655393364144 140725163491392 2655397312904
print(id(list2[0]),id(list2[1]),id(list2[2]))
# 2655393364144 140725163491392 2655397313672
??针对不可变类型, 拷贝以后任然还是用原来值的内存地址
??针对可变类型, 拷贝之后会申请新的内存地址存放
??当改变"list1"内的第一或者第二个元素(不可变元素)
list1[0] = "aaa"
print(list1[0],id(list1[0]))
# aaa 2655394824496
print(list2[0],id(list2[0]))
# str 2655393364144
??发现"list1"改变的值的内存地址已经变化了,说明是产生的新值,与原来的"str"取消了对应
??而"list2"中的值和"id"都没变,说明""list1"的改变与"list2"无关
??当改变子列表里面的值时
list1[2][0] = 333
print(list1[2],id(list1[2]))
# [333, 222] 2655397312904
print(list2[2],id(list2[2]))
# [111, 222] 2655397313672
??我们发现"list1"的变化依然与"list2"无关
标签:就是 行修改 改变 不可变类 浅拷贝 tee 地址 另一个 需要
原文地址:https://www.cnblogs.com/songhaixing/p/14015669.html