首先,不管是赋值还是深浅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

 

posted on 2016-05-04 19:59  MnCu  阅读(366)  评论(0编辑  收藏  举报