- UID
- 1420045
- 在线时间
- 小时
- 注册时间
- 2019-9-12
- 最后登录
- 1970-1-1
- 主题
- 帖子
- 性别
- 保密
|
5#
楼主 |
发表于 2020-7-3 00:48:10
|
只看该作者
朝花夕拾】复制与引用、浅拷贝与深拷贝- 复制
- 引用
- 浅拷贝
- 但是我想a和b互不干扰怎么办?拷贝啊!
- 但是这种只能表层拷贝
- 深拷贝
复制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]
python但是这种只能表层拷贝- >>> 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]
python为什么里面那个列表改了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]
|
|