可变对象指的是对象的内容是可变的,而不可变的对象表示内容不可变。
常用的可变不可变对象有
这里的可变与不可变是指在原来保存地址的基础上是否可变。
可变对象的=操作是将等号右边的变量赋给左边,所以这两个变量指向的是同一片内存,所以只要这两个对象中的任何一个修改了内存中的变量,那么另外一个变量也会跟着改变。
test = [1,2,3]
a = test
b = test
print(id(test),id(a),id(b))
==>2843376973704 2843376973704 2843376973704
a[1] =0
print(test,a,b)
==>[1, 0, 3] [1, 0, 3] [1, 0, 3]
python中对序列进行乘法操作表示对该序列的复制,但是*操作涉及到深浅复制。
eg1:
test = [[1]*3]*3
print(test)
test[0][0]=0
print(test)
==>
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
[[0, 1, 1], [0, 1, 1], [0, 1, 1]]
eg2:
test = [[1]*3 for i in range(3)]
print(test)
test[0][0]=0
print(test)
==>
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
[[0, 1, 1], [1, 1, 1], [1, 1, 1]]
显然,eg2才是我们想要的结果。
在使用*操作复制序列时,当序列中的元素X是不可变对象时,那么复制出的元素是神复制;如果序列中的元素X是可变对象时,那么复制出的元素是浅复制,即复制出来的序列和原序列指向同一片内存。
上面的话很重要,可以解释为什么[1]可以使用乘来复制,而[1,1,1]不可以。
如果复制的对象是可变对象中有不可变对象
这种情况下,可变元素是浅复制,不可变元素是深复制
a = [1,2,[0,0]]
b =a*3
print(b)
b[0]=0
b[2][1] =1
print(b)
==>
[1, 2, [0, 0], 1, 2, [0, 0], 1, 2, [0, 0]]
[0, 2, [0, 1], 1, 2, [0, 1], 1, 2, [0, 1]]