七、浅拷贝和深拷贝
name1 = 'alex'
name2 = name1
name1 = 'rooney'
name2 = ?
答案:name2还是等于alex,因为字符串的重新定义是在内存里面重新开辟一个空间,字典,列表,就是在原来的内存空间里面修改,所以上题如果是字典或者列表的话那name2的值就是rooney。
总结:
字符串:不紧跟=======》
字典、列表:紧追不舍=======》
11.copy ======》浅拷贝(只copy第一层,再往下它就不copy了)
首先,我创建了一个这样的字典,里面有嵌套
>>> for i in range(5):c[i] = [] >>> c {0: [], 1: [], 2: [], 3: [], 4: []} >>> c[1] [] >>> c[1].append({'b':'rooney'}) >>> c {0: [], 1: [{'b': 'rooney'}], 2: [], 3: [], 4: []} 然后,我用d=c,把c的值赋给了d, >>> d = c >>> d {0: [], 1: [{'b': 'rooney'}], 2: [], 3: [], 4: []} >>> c {0: [], 1: [{'b': 'rooney'}], 2: [], 3: [], 4: []} 根据上面的说法,这时候我改变c的值,d也跟着变 >>> c['rain'] = "test" >>> >>> c {0: [], 1: [{'b': 'rooney'}], 2: [], 3: [], 4: [], 'rain': 'test'} >>> d {0: [], 1: [{'b': 'rooney'}], 2: [], 3: [], 4: [], 'rain': 'test'} 然后我让e=c.copy(),我们会发现,当c的值改变了,e并没有跟着改变 >>> e=c.copy() >>> c['sun'] = "wwwwwww" >>> c {0: [], 1: [{'b': 'rooney'}], 2: [], 3: [], 4: [], 'rain': 'test', 'sun': 'wwwwwww'} >>> e {0: [], 1: [{'b': 'rooney'}], 2: [], 3: [], 4: [], 'rain': 'test'} 最后我把c里面嵌套的字典的rooney改成了ramos,发现e的值也跟着变了 >>> c[1][0]['b'] 'rooney' >>> c[1][0]['b']='ramos' >>> d {0: [], 1: [{'b': 'ramos'}], 2: [], 3: [], 4: [], 'rain': 'test', 'sun': 'wwwwwww'} >>> e {0: [], 1: [{'b': 'ramos'}], 2: [], 3: [], 4: [], 'rain': 'test'} >>>
总结:
浅拷贝的意思就是第一层我不拷贝,并且以后第一层的修改我也不会跟着变,但是里面嵌套的层的修改我还是会跟着变
深拷贝的意思就是第一层我不拷贝,并且以后第一层的修改我也不会跟着变,但是里面嵌套的层的修改我也不跟着变,即相当于字符串一样,你变你的,我怎么都不跟着你变了,我完全独立了。
如果你想深copy,就要介入python的一个独立的模块,名字就叫做copy
import copy
f = copy.deepcopy(c)