变量赋值&深浅copy

1、变量赋值

list1与list2指向的是同一个内存地址,所以他们是完全一样的。在举个例子,比如张三李四合租在一起,那么对于客厅来说,他们是公用的,张三可以用,李四也可以用,但是突然有一天张三把客厅的的电视换成投影了,那么李四使用客厅时,想看电视没有了,而是投影了,对吧?list1,list2指向的是同一个列表,任何一个变量对列表进行改变,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表。

list1 = [1, 2, 3, [22, 33]]
list2 = list1

list2.append(666)

print(f'list1: {list1}')
print(f'list2: {list2}')

# list1: [1, 2, 3, [22, 33], 666]
# list2: [1, 2, 3, [22, 33], 666] 

变量赋值&深浅copy_第1张图片

2、浅copy

对于浅copy,只是在内存中重新创建了开辟了一个空间存放一个新列表,但是新列表中的元素与原列表中的元素是公用的。

浅copy::会在内存中新开辟一个空间,存放这个copy的列表,但是列表里面的内容还是沿用之前对象的内存地址,所以list1、list2的id不同,但是内容id相同

list1 = [1, 2, 3, [22, 33]]
list2 = list1.copy()   # list1.copy() 即开辟一个空间存放的是对 list1 copy 的列表

# 1、新列表中的元素与原列表中的元素是公用的,list1、list2的id不同,但是内容id相同
print(id(list1))   # 2392406434760
print(id(list2))   # 2392407419080

print(id(list1[0]), id(list1[-1]))
# 1560505360 2859996489992

print(id(list2[0]), id(list2[-1]))
# 1560505360 2859996489992

# 2、改变list1内存空间内 第一个元素的 内存指向关系,list2列表还是沿用原来的内存关系
list1[0] = 99
print(f'list1: {list1}')
# list1: [99, 2, 3, [22, 33]]

print(f'list2: {list2}')
# list2: [1, 2, 3, [22, 33]]

# 3、浅copy的所有子元素都是共用一个内存指向关系,当可变子元素被修改后,浅copy对象也随之被修改
list2[-1].append(666)
print(f'list1: {list1}')
# list1: [99, 2, 3, [22, 33, 666]]

print(f'list2: {list2}')
# list2: [1, 2, 3, [22, 33, 666]]

变量赋值&深浅copy_第2张图片
变量赋值&深浅copy_第3张图片

3、深copy

深copy则会在内存中开辟新空间,将原列表以及列表里面的可变的数据类型重新创建1份,不可变的数据类型则沿用之前的。

深copy来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的

import copy
list1 = [1, 2, 3, [22, 33]]
list2 = copy.deepcopy(list1)

print(id(list1))   # 1928617808136
print(id(list2))   # 1928618109768

print(id(list1[0]), id(list1[-1]))
# 1560505360 2743586318152
print(id(list2[0]), id(list2[-1]))
# 1560505360 2743586319112

list2[-1].append(666)
print(f'list1: {list1}')
# list1: [1, 2, 3, [22, 33]]

print(f'list2: {list2}')
# list2: [1, 2, 3, [22, 33, 666]]

变量赋值&深浅copy_第4张图片
变量赋值&深浅copy_第5张图片

3、总结

  • 浅copy: list dict: 嵌套的可变数据类型同一个
  • 深copy: list dict: 嵌套的可变数据类型不是同一个

4、test

list1 = [1, 2, 3, [22, 33]]
list2 = list1[:]
list1[-1].append(666)

print(list1)
# [1, 2, 3, [22, 33, 666]]

print(list2)
# [1, 2, 3, [22, 33, 666]]

你可能感兴趣的:(Python,python)