引用:https://www.jb51.net/article/142775.htm
列表赋值:
1
2
3
4
5
6
7
|
>>> a
=
[
1
,
2
,
3
]
>>> b
=
a
>>>
print
b
[
1
,
2
,
3
]
>>> a[
0
]
=
0
>>>
print
b
[
0
,
2
,
3
]
|
解释:[1, 2, 3]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变
如果希望b不改变,可以用到切片
1
2
3
4
|
>>> b
=
a[:]
>>> a[
0
]
=
0
>>>
print
b
[
1
,
2
,
3
]
|
解释,切片a[:]会产生一个新的对象,占用一块新的内存,b指向这个新的内存区域,因此改变a所指向的对象的值,不会影响b
列表深拷贝和浅拷贝
浅拷贝
1
2
3
4
5
6
7
8
|
>>>
import
copy
>>> a
=
[
1
,
2
,
3
, [
5
,
6
]]
>>> b
=
copy.copy(a)
>>>
print
b
[
1
,
2
,
3
, [
5
,
6
]]
>>> a[
3
].append(
'c'
)
>>>
print
b
[
1
,
2
,
3
, [
5
,
6
,
'c'
]]
|
深拷贝
1
2
3
4
5
|
>>> a
=
[
1
,
2
,
3
, [
5
,
6
]]
>>> b
=
copy.deepcopy(a)
>>> a[
3
].append(
'c'
)
>>>
print
b
[
1
,
2
,
3
, [
5
,
6
]]
|
拷贝即是开辟一块新的内存空间,把被拷贝对象中的值复制过去。而浅拷贝并没有为子对象[5,6]开辟一块新的内存空间,而仅仅是实现对a中[5,6]的引用。所以改变a中[5,6]的值,b中的值也会发生变化。
深拷贝则是为子对象也开辟了一块新空间。所以改变a中[5, 6]的值,并不影响b
数组赋值不能用切片来达到相同的目的
1
2
3
4
5
6
|
>>>
import
numpy as np
>>> a
=
np.array([
1
,
2
,
3
])
>>> b
=
a[:]
>>> a[
0
]
=
5
>>>
print
a, b
[
5
2
3
] [
5
2
3
]
|
如上,虽然用切片,但不能达到修改a而不影响b的目的。说明a,b仍然指向同一块内存。
此时,只能用拷贝
1
2
3
4
|
>>> b
=
a.copy()
>>> a[
0
]
=
5
>>>
print
a, b
[
5
2
3
] [
1
2
3
]
|
此时修改a不会影响到b。其中的原因以后进一步深究。
注意,列表的拷贝是copy.copy(obj)或copy.deepcopy(obj),数组的拷贝是obj.copy()
以上这篇对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。