03月20, 2019

【朝花夕拾】复制与引用、浅拷贝与深拷贝

复制

Dota: 幻象神符、分身斧、TB分身、混沌分身 LOL: 小丑分身、妖姬分身、猴子分身 现实版:范冰冰和范冰冰的蜡像 复制出来的东西和本体是分离的,互不干涉。

引用

我银行卡里有一块钱的存款(没错,我是穷逼),我打开手机银行app看了看,嗯,还有一块钱,我去ATM插卡查了查,嗯,还有一块钱,我打开支付宝查了查,可用一块钱。此时口渴难耐,刷卡一块钱买了一瓶矿泉水(连矿泉水都要刷卡),然后我打开手机银行app一看,完了完了,存款只剩下0元了,打开支付宝查了查,一块钱也用不了了,插到ATM上看了看,余额0元。为什么我只刷了卡,但是其他两个地方查到的结果也随之改变了呢,因为支付宝、银行app、ATM查询都是对我存款的引用。 python中的赋值语句,都是引用。

浅拷贝

>>>a = [1, 2, 3]
>>>b = a
>>>b
[1, 2, 3]
>>>a[0] = 0
>>>a
[0, 2, 3]
>>>b
[0, 2, 3]

为什么我们改变了数列a的第0个元素,但是数列b也跟着改变了呢,刚刚说到python的赋值操作都是引用,b = a其实就是b指向了a指向的地址,请参考我刚刚说的引用,a是银行卡,b是支付宝,都是我的存款的引用,a刷卡消费了,b支付宝当然一起变了。

但是我想a和b互不干扰怎么办?拷贝啊!

>>>a = [1, 2, 3]
>>>b = a[::] # 这里就是复制了一份a
>>>b
[1, 2, 3]
>>>a[0] = 0
>>>a
[0, 2, 3]
>>>b
[1, 2, 3]

但是这种只能表层拷贝

>>> a = [0, [1, 2], 3]
>>> b = a[::]
>>> a
[0, [1, 2], 3]
>>> b
[0, [1, 2], 3]
>>> a[0] = 1
>>> a
[1, [1, 2], 3]
>>> b
[0, [1, 2], 3]
>>> a[1][0] = 0
>>> a
[1, [0, 2], 3]
>>> b
[0, [0, 2], 3]

为什么里面那个列表改了a也会影响b呢?因为b = a[::]只是表层拷贝,里面的列表只是复制了一个引用出来,这两个引用指向的地址是一样的,改了其中一个,当然另一个也跟着变了(看不懂没关系,过一周再看一遍)。

深拷贝

我想完全拷贝一份啊怎么办?

>>> import copy
>>> a = [0, [1, 2], 3]
>>> b = copy.deepcopy(a)
>>> a
[0, [1, 2], 3]
>>> b
[0, [1, 2], 3]
>>> a[0] = 1
>>> a
[1, [1, 2], 3]
>>> b
[0, [1, 2], 3]
>>> a[1][0] = 0
>>> a
[1, [0, 2], 3]
>>> b
[0, [1, 2], 3]
>>> b[1][0] = 2
>>> 
>>> a
[1, [0, 2], 3]
>>> b
[0, [2, 2], 3]

本文链接:http://www.yuqiaochuang.com/post/【朝花夕拾】复制与引用、浅拷贝与深拷贝.html

-- EOF --

Comments

""