看一個例子
1
2
3
4
|
d={'test':1}
d_test=d
d_test['test']=2
print d
|
如果你在命令行實踐的話,會發現你改動的是d_test ,但是d 也跟着改變了。
通常這和我們期待的不一樣。
Why?
因為字典d 是一個object ,而d_test=d並沒有真正的將該字典在內存中再次創建。只是指向了相同的object。這也是python 提高性能,優化內存的考慮。
實際場景
1
2
3
4
5
6
|
d={"name":""}
l=[]
for i in xrange(5):
d["name"]=i
l.append(d)
print l
|
C:\Python27\python.exe D:/py/aliexpress/test.py
[{'name': 4}, {'name': 4}, {'name': 4}, {'name': 4}, {'name': 4}]
loop 后可能跟你想要的結果並不相同。
即使append到list 中,但是,list中存放的也是一個對象,或者說是字典的地址。而非內存中真正的存儲空間。
使用 .copy()方法。可以創建一個新的獨立的字典
1
2
3
4
5
6
7
|
d={"name":""}
l=[]
for i in xrange(5):
test=d.copy()
test["name"]=i
l.append(test)
print l
|
C:\Python27\python.exe D:/py/aliexpress/test.py
[{'name': 0}, {'name': 1}, {'name': 2}, {'name': 3}, {'name': 4}]
更新:
1
2
3
4
5
6
|
a={'q':1,'w':[]}
b=a.copy()
b['q']=2
b['w'].append(123)
print a
print b
|
這個時候發現a中'q'的值不會變化但是其列表中的值還是發生了改變
因為copy是淺層次copy
但是這里有個track
1
2
3
4
5
6
|
a={'q':1,'w':[]}
b=a.copy()
b['q']=2
b['w']=[123]
print a
print b
|
直接賦值的話,則不會改變a中的結構(多半是append這個方法的關系)
深層次的copy
1
2
3
|
import copy
a={'q':1,'w':[]}
b=copy.deepcopy(a)
|