描述
在Python的列表、字典里有很多的概念,像赋值、复制、深拷贝、浅拷贝。
赋值
一般来说,对于普通变量x,y,直接把x值赋给y就能让两个变量相同
>> > x = 1
>> > id ( x)
2093991856
>> > y = x
>> > id ( y)
2093991856
>> > y = 2
>> > id ( y)
2093991872
>> > x
1
>> > id ( x)
2093991856
上面普通的变量通过赋值可以实现复制的功能,但像列表,字典这种可变类型就不一样了:
>> > a_list = [ 1 , 2 , 3 ]
>> > id ( a_list)
62615240
>> > b_list = a_list
>> > id ( b_list)
62615240
>> > a_list[ 0 ] = 4
>> > a_list
[ 4 , 2 , 3 ]
>> > id ( a_list)
62615240
>> > b_list
[ 4 , 2 , 3 ]
>> > id ( b_list)
62615240
这是因为列变量指向的是列表所在的内存地址,a_list和b_list都是指向同一个内存地址,因此列表中任意一个元素的变化,都会影响这两个列表的值跟着变化。那么怎么要这两个列表独立分开呢,就得用上列表的浅拷贝功能了
浅拷贝
通过切片拷贝
>> > a_list = [ 1 , 2 , 3 ]
>> > id ( a_list)
62615048
>> > b_list = a_list[ : ]
>> > id ( b_list)
62615496
>> > b_list
[ 1 , 2 , 3 ]
>> > b_list[ 0 ] = 4
>> > b_list
[ 4 , 2 , 3 ]
>> > id ( b_list)
62615496
>> > a_list
[ 1 , 2 , 3 ]
>> > id ( a_list)
62615048
通过list()函数复制
>> > a_list = [ 1 , 2 , 3 ]
>> > id ( a_list)
62615208
>> > b_list = list ( a_list)
>> > id ( b_list)
56270600
>> > b_list
[ 1 , 2 , 3 ]
>> > b_list[ 0 ] = 4
>> > b_list
[ 4 , 2 , 3 ]
>> > a_list
[ 1 , 2 , 3 ]
通过列表extend()方法复制
>> > a_list = [ 1 , 2 , 3 ]
>> > id ( a_list)
47685160
>> > b_list = [ ]
>> > b_list. extend( a_list)
>> > id ( b_list)
54012712
>> > b_list
[ 1 , 2 , 3 ]
>> > b_list[ 0 ] = 4
>> > b_list
[ 4 , 2 , 3 ]
>> > a_list
[ 1 , 2 , 3 ]
通过copy模块来复制
>> > import copy
>> > a_list = [ 1 , 2 , 3 ]
>> > id ( a_list)
54013288
>> > b_list = [ ]
>> > b_list = copy. copy( a_list)
>> > id ( b_list)
54012712
>> > b_list
[ 1 , 2 , 3 ]
>> > b_list[ 0 ] = 4
>> > b_list
[ 4 , 2 , 3 ]
>> > a_list
[ 1 , 2 , 3 ]
通过列表解析(列表推导)
>> > a_list = [ 1 , 2 , 3 ]
>> > b_list = [ i for i in a_list]
>> > b_list[ 0 ] = 4
>> > b_list
[ 4 , 2 , 3 ]
>> > a_list
[ 1 , 2 , 3 ]
深拷贝
从上面几种拷贝方法可以看出,a_list和b_list列表是两个相互独立的变量,也成功实现了复制功能,那么为什么说这些是浅拷贝呢,如下 :
>> > a_list = [ 1 , 2 , 3 , [ 'a' , 'b' ] ]
>> > b_list = a_list[ : ]
>> > b_list
[ 1 , 2 , 3 , [ 'a' , 'b' ] ]
>> > a_list[ 0 ] = 4
>> > a_list
[ 4 , 2 , 3 , [ 'a' , 'b' ] ]
>> > b_list
[ 1 , 2 , 3 , [ 'a' , 'b' ] ]
>> > a_list[ 3 ] [ - 1 ] = 5
>> > a_list
[ 4 , 2 , 3 , [ 'a' , 5 ] ]
>> > b_list
[ 1 , 2 , 3 , [ 'a' , 5 ] ]
如上可知,使用这种复制的列表,一旦涉及到列表中有多维列表时,修改其子列表时,所有列表的子列表都会跟着修改。 要想实现不管多少维度的列表都能完全独立的话,就需要用到Python标准库中copy库提供的deepcopy函数了,这就是深拷贝,如下:
>> > import copy
>> > a_list = [ 1 , 2 , 3 , [ 'a' , 'b' ] ]
>> > b_list = copy. deepcopy( a_list) 用函数deepcopy实现深拷贝
>> > b_list
[ 1 , 2 , 3 , [ 'a' , 'b' ] ]
>> > a_list[ 3 ] [ - 1 ] = 5
>> > a_list
[ 1 , 2 , 3 , [ 'a' , 5 ] ]
>> > b_list
[ 1 , 2 , 3 , [ 'a' , 'b' ] ]