python学习笔记23_深浅拷贝

2018-03-15  本文已影响0人  flamingocc

python 笔记23

.copy( ) 与 浅拷贝

s = [1,'Flamingo','Flamingo']
s2 = s.copy()
print s2


输出: [1,'Flamingo','Flamingo']

提问:如果现在修改s2的值,那么s的值会不会改变呢?

s = [1,'Flamingo','Flamingo']
s2 = s.copy()
s2[0] = 2
print(s)
print(s2)

输出:
[1, 'Flamingo', 'Flamingo']
[2, 'Flamingo', 'Flamingo']

这样是否能证明修改拷贝了的数据并不会影响原来的数据呢?
看下面一个例子:

s = [[1,2],'Flamingo','Flamingo']
s2 = s.copy()
s2[0][1] = 3
print(s2)
print(s)

输出:
[[1, 3], 'Flamingo', 'Flamingo']
[[1, 3], 'Flamingo', 'Flamingo']

显然,随着s2的修改,s的值也发生了改变。
那么s和s2之间到底存在什么样的关系呢?怎么解释这种关系?

这种关系称为"浅拷贝"。

这里列表a有4个值:a = [[1,2],3,4],其中1和2被放在了另一个列表中。
b有3个值:b = [1,3,4],1被放在了另一个列表中。
下面修改列表b的第一个值为8,b = [8,3,4],那么存储1和2的列表就发生了改变,从[1,2]变成了[8,2],而a[0]此时就是新的列表[8,2]了,a列表此时为:a = [[8,2],3,4]。
这就是"浅拷贝",只拷贝第一层数据,所以修改整型和字符串没有影响,但修改列表则有影响。当然对于可变的字典也是同样的原理。

对于整型和字符串则不会改变

a = 1
b = a
a = 2
print(a)
print(b)

输出:
    a = 2
    b = 1

这里输出a和b的值不一样,区别于列表。

看下面两个例子理解copy()的原理:




copy浅拷贝内存解释:

提问:如果现在把a删了,那么b还存在吗?
回答:当然不会,删除a只是删除a这个变量名,而存在内存中的数据还存在,故b还是存在的。

浅copy的作用是什么呢?

举个栗子:

一位男性在银行开了一张信用卡,额度150000,剩余额度90000.
如果男性要给妻子开同一张信用卡的副卡呢?那么就能能通过浅拷贝来实现。

husband = ["Flam",123,[150000,90000]]
wife = husband.copy()
wife[0] = "Mingo" 
wife[1] = 456

深拷贝 copy.deepcopy( )

如果我们要复制一份完全一样,而且不受其他变量影响的数据呢?
这个时候就需要深拷贝了。
需要引入一个copy模块。

例子:


上一篇 下一篇

猜你喜欢

热点阅读