首先,不管是赋值还是深浅copy,都是针对那些可能会产生变化的值进行区分的,也就是对于数字,字符串来说,区分赋值,深浅copy是毫无意义的。
那么,让我们来对那些可变的像list set dict tuple……来进行探讨。
赋值:
有两种修改n的方法:
1 直接对n赋值
>>> n=[1,2] >>> g=n >>> id(n) 140529062430792 >>> id(g) 140529062430792 >>> n=[1,3] >>> g [1, 2] >>> id(n) 140529062430920 >>> id(g) 140529062430792
2 对n的某个元素进行赋值
>>> n=[1,2] >>> g=n >>> id(n) 140529062430728 >>> id(g) 140529062430728 >>> n[1]=3 >>> g [1, 3] >>> id(n) 140529062430728 >>> id(g) 140529062430728
浅copy
>>> import copy >>> name=['tong','yang']
>>> n=[1,name]
>>> g=copy.copy(n)
>>> g
[1, ['tong', 'yang']]
>>> id(n)
140529062259976
>>> id(g)
140529062259848 #两个变量(n和g)的地址不相同
当修改n的name的元素时:
>>> name[1]='hua' >>> n [1, ['tong', 'hua']] >>> g [1, ['tong', 'hua']] >>> id(n) 140529062259976 >>> id(g) 140529062259848 #n和g的值相同,并且内存地址都没有改变
浅copy只会copy一层,所以在上例中n和g的值都改变了。
深copy
>>> name=['tong','yang'] >>> n=[1,name] >>> g=copy.deepcopy(n) >>> g [1, ['tong', 'yang']] #g的第二个元素已经不是变量name了。 >>> id(n) 140529062430728 >>> id(g) 140529062259976 #n与g的地址不同
当修改name的元素时:
>>> name[1]='hua' >>> n [1, ['tong', 'hua']] >>> g [1, ['tong', 'yang']] #n的值变了,但g的值没有变。深copy会copy所有层。
深copy则会copy所有层,并且会将其中的变量的值直接输出取代变量。
本文参考了:http://www.cnblogs.com/wupeiqi/articles/5133343.html
no copyright !! 个人原创博客欢迎转载,可以不保留出处。