字符串copy
# 首先来看字符串的copy >>>name1 = 'Demo' >>>name2 = name1 ''' 这个时候name2 相当于copy了name1的内容 通过id()来观察name1和name2的内容地址会发现他们都是指向了同一块内容地址 ''' # 现在name1 重新赋值 观察name1和name2的内存地址 >>>name1 = ’jack' >>>name2 Demo ''' 发现name1的内容地址发生变化,而name2没有发生变化 得出结论:字符串copy后将原来的值变化,不会影响copy的对象,他是重新开辟内存的方式 '''
浅列表Copy
# 创建列表 >>>list1 = [1,2,3,4,5] >>>list2 = list1.copy() >>>list2 [1,2,3,4,5] ''' 再次通过id()来看list1和list2开辟的内存空间发现,list1和list2的内存空间地址是不同的 在通过id()来查看list1和list2里边的元素地址,发现指向是相同的 结论:列表copy()是相当于先开辟一块空间,让里边的元素指向相同地址 再次修改list1里边元素,发现是和字符串一样的操作,都是重新开辟空间地址指向,不会 对copy的对象有影响 ''' >>>list1[0] = 'Demo' >>>list2 [1,2,3,4,5] >>>list1 ['Demo',2,3,4,5]
嵌套列表copy
# 先创建一个嵌套列表 list1 = [1,2,3,4,[5,6]] # 复制列表 list2 = list1.copy() # 查看嵌套内存地址,发现是一致的 id(list1[4]) id(list2[4]) # 得到内存地址是同一个,在看嵌套里边元素地址,发现也是一致的 id(list1[4][0]) id(list2[4][0]) # 改变list1嵌套元素 list1[4][0] = 'Demo' # 分别打印list1和list2 >>>list1 [1, 2, 3, 4, ['Demo', 6]] >>>list2 [1, 2, 3, 4, ['Demo', 6]] ''' 这是为什么呢? 再次打印id(list1[4]) 发现地址跟修改之前是一样的 这是因为,嵌套复制时候,相当于把里边的嵌套列表整体指向同一个地址 当我们修改嵌套里边内容时候,这个列表容器并没有修改,所以里边元素修改复制列表也一同修改 除非我们像字符串那样将嵌套的列表重新指向新内存地址,复制列表才不会被修改 '''
字典copy
字典也有copy()方法,他也是分为浅表和嵌套copy,和列表是一样的原理,可以通过访问内存地址的方式来自己尝试