书w3school网站建设教程,珠海舒讯网站建设,人和马做的网站,html5自适应网站模板在python语言中#xff0c;因为其面向对象的特性#xff0c;在进行列表拷贝时可能会出现一些意想不到的结果#xff0c;涉及到列表的浅拷贝和深拷贝相关问题#xff0c;本文将对其进行总结。 首先我们来看以下代码。
my_list [1, 2, 3]
your_list my_list
your_list[0] … 在python语言中因为其面向对象的特性在进行列表拷贝时可能会出现一些意想不到的结果涉及到列表的浅拷贝和深拷贝相关问题本文将对其进行总结。 首先我们来看以下代码。
my_list [1, 2, 3]
your_list my_list
your_list[0] 4
print(id(your_list))
print(your_list)
print(id(my_list))
print(my_list)输出
2492863632320
[4, 2, 3]
2492863632320
[4, 2, 3] 将列表变量名直接赋值给另一个变量并不会创建一个新的列表对象而是使得一个变量多了一个标签变量名只是对象的一个标签也可以理解为变量名只储存了对象的地址所以此时对your_list或my_list的任何更改都会体现在同一个对象上。 接下来进入正题浅拷贝指的是只创建了新的列表对象而列表对象的内容列表内对象的地址不变。 我们来看以下代码。
import copymy_list [1, 2, 3]your_list list(my_list) #工厂函数
his_list my_list[:] #切片操作
her_list copy.copy(my_list) #copy模块的copy函数print(id(my_list))
for i in my_list:print(id(i))print(id(your_list))
for i in your_list:print(id(i))print(id(his_list))
for i in his_list:print(id(i))print(id(her_list))
for i in her_list:print(id(i))输出
16721501851521672146125040
1672146125072
167214612510416721500294401672146125040
1672146125072
167214612510416721500950401672146125040
1672146125072
167214612510416721500947201672146125040
1672146125072
1672146125104 可以发现虽然使用这三种方法新建了三个不同的列表对象但这些对象的内容是一致的也就是说三个列表对象的内容是同一批地址此时列表对象的元素中有可变对象如列表和字典等则可能会出现意想不到的结果如下代码所示。
import copy
my_list [1, 2, [1, 2]]your_list list(my_list) #工厂函数
his_list my_list[:] #切片操作
her_list copy.copy(my_list) #copy模块的copy函数your_list[2][0] 3
print(my_list)
print(your_list)
print(his_list)
print(her_list)his_list[2][1] 4
print(my_list)
print(your_list)
print(his_list)
print(her_list)her_list[2].append(5)
print(my_list)
print(your_list)
print(his_list)
print(her_list)输出
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [3, 2]][1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]][1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]] 如果想要完全拷贝列表以及其内部的对象需要使用copy模块中的deepcopy函数如下所示。
import copy
my_list [1, 2, [1, 2]]your_list list(my_list) #工厂函数
his_list my_list[:] #切片操作
her_list copy.copy(my_list) #copy模块的copy函数
deep_list copy.deepcopy(my_list) #copy模块的deepcopy函数your_list[2][0] 3
print(my_list)
print(your_list)
print(his_list)
print(her_list)
print(deep_list)his_list[2][1] 4
print(my_list)
print(your_list)
print(his_list)
print(her_list)
print(deep_list)her_list[2].append(5)
print(my_list)
print(your_list)
print(his_list)
print(her_list)
print(deep_list)输出
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [3, 2]]
[1, 2, [1, 2]][1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
[1, 2, [1, 2]][1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
[1, 2, [1, 2]] 此时无论怎么对原对象操作deep_list都不会受到影响因为此时不止列表对象是新的连列表元素对象也是新的。