初学python随笔——Copy

字符串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,和列表是一样的原理,可以通过访问内存地址的方式来自己尝试

 

  

猜你喜欢

转载自www.cnblogs.com/CrazyDemo/p/9424988.html