将当前的列表复制出一份相同的列表,可以将这个新的列表赋值给一个新的变量,新列表与旧列表内容相同,但内存空间不同。
old_list = ['a','b','c']
new_list = old_list.copy()
print(new_list)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py
['a', 'b', 'c']
进程已结束,退出代码为 0
a = [1,2,3]
b = a
说明a列表与b列表都生活在一个相同的内存房子里,所以它们的数据是相同的。
a里有1,2,3,b里也有1,2,3,只不过,如果给a里加入一个元素或者删除一个元素,b里也会发生相同的变化。
同理,给b列表中添加或删除元素,a列表也会受到相同的影响。
而copy函数则有所不同。
b列表参照a列表又造了一个内存房子,并且内部的成员长得都一样。
但是因为是两个不同的房间,无论是a房间的数据怎么发生变化,还是b房间的数据发生了变化,相互之间都不会受到任何影响。
这个就是copy函数和2次赋值在功能上的区别。
# coding:utf-8
a = [1,2,3]
b = a.copy()
b.append(4)
print(b)
print(a)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py
[1, 2, 3, 4]
[1, 2, 3]
进程已结束,退出代码为 0
浅拷贝: 通俗的说,我们有一个列表a,列表里的元素还是列表,当我们拷贝出新列表b后,无论是a还是b的内部的列表中的数据发生了变化后,相互之间都会受到影响。
不像之前的例子一样,a和b无论发生变化,相互之间不会受到影响。因为它只是在第一层不会受到影响。但是如果列表中还有列表,它是属于一种深层次的数据。如果深层数据发生变化,那么相互之间还是会发生变化。
总结:只能对数据结构的第一层数据进行拷贝,如果数据结构里有更深层的数据,则无法进行拷贝。深层数据,原始变量和新变量是共享的。发生变化也是共享的。这就是浅拷贝。
a = [[1,2,3],[5,6,7]]
b = a.copy()
print(b)
b[0].append(10)
print(b)
print(a)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py
[[1, 2, 3], [5, 6, 7]]
[[1, 2, 3, 10], [5, 6, 7]]
[[1, 2, 3, 10], [5, 6, 7]]
进程已结束,退出代码为 0
深拷贝: 不仅对第一层数据进行了copy,对深层的数据也进行copy,原始变量和新变量完全不共享数据。
import copy
a = [[1,2,3],[4,5,6]]
b = copy.deepcopy(a)
print(b)
b[0].append(10)
print(b)
print(a)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3, 10], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
进程已结束,退出代码为 0
例1:
# coding:utf-8
old_list = ['python','django','flask']
new_list = old_list
new_list.append('tornado')
print(new_list)
print(old_list)
print(id(new_list),id(old_list))
old_list.remove('tornado')
print(new_list,old_list)
del new_list
print(old_list)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/list_copy.py
['python', 'django', 'flask', 'tornado']
['python', 'django', 'flask', 'tornado']
4299404864 4299404864
['python', 'django', 'flask'] ['python', 'django', 'flask']
['python', 'django', 'flask']
进程已结束,退出代码为 0
说明:因为有两个变量都在共用一个内存地址,所以本次del只删除了变量名,并没有删除内存中的地址。过去只有一个变量名对应了这个内存地址,当我们删除了这个变量名,内存地址没有人使用,所以内存管家就把它清空了。
但是通过二次赋值的方式,使多个变量名都在使用同一个内存地址,所以仅仅删除一个变量名,还不会将这个内存地址彻底清除。
例2:
# coding:utf-8
old_list = ['python','django','flask']
new_list = old_list
new_list.append('tornado')
print(new_list)
print(old_list)
print(id(new_list),id(old_list))
old_list.remove('tornado')
print(new_list,old_list)
del new_list
print(old_list)
old_list_copy = ['python','django','flask']
new_list_copy = old_list_copy.copy()
print(old_list_copy,new_list_copy)
new_list_copy.append('tornado_copy')
print(old_list_copy,new_list_copy)
print(id(old_list_copy),id(new_list_copy))
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/list_copy.py
['python', 'django', 'flask', 'tornado']
['python', 'django', 'flask', 'tornado']
4339742336 4339742336
['python', 'django', 'flask'] ['python', 'django', 'flask']
['python', 'django', 'flask']
['python', 'django', 'flask'] ['python', 'django', 'flask']
['python', 'django', 'flask'] ['python', 'django', 'flask', 'tornado_copy']
4339719360 4340597760
进程已结束,退出代码为 0