由于是python的新手,對python的理解還不夠深,在爬取數(shù)據(jù)時遇到了不小的麻煩凄杯。
我把代碼簡化如下:
ob_a =?{'a':3,'b':4}
a = []
for c in range(5):
? ? ob_b = ob_a
? ? ob_b['a'] ='p-a'+str(c)
? ? ob_b['b'] ='p-b'+str(c)
? ? a.append(ob_b)
print(a)
正常的想法會是生成了多個對象的list. ?各個對象的值根據(jù)迭代中的C值變化。
但是實際輸出,多個對象的值是相同的拙泽。
這個問題糾結了我很久,最后從官方文檔發(fā)現(xiàn)裸燎,原來python的賦值顾瞻,不是將值賦予變量,而是讓變量指向值德绿。這個可能比較不好理解荷荤。
a = {'a':1,'b':2}
b = a
a['a']=2
print(b)
>>>{'a':2,'b':2}
這里b的賦值變化了退渗,看另外一個例子:
a = {'a':1,'b':2}
b = a
a =?{'a':3,'b':4}
print(b)
>>>{'a':1,'b':2}
這里b的值沒有變化
為什么會出現(xiàn)這種情況呢,原來b=a的時候蕴纳,并不是將a的值賦予b,而是讓b的值指向了{'a':1,'b':2}
當改變a的指向時(a =?{'a':3,'b':4})会油,b的指向沒有改變還是指向的{'a':1,'b':2}
當改變{'a':1,'b':2}里面元素的值時(a['a']=2),內(nèi)里的值發(fā)生了改變古毛,指向該值的b也會相應的發(fā)生改變翻翩。
好了這就是為什么我第一段代碼會生成對象完全相同的原因。怎么解決呢稻薇,需要python的copy機制嫂冻。
a = []
for c in range(5):
? ? ob_b = ob_a
? ? ob_b['a'] ='p-a'+str(c)
? ? ob_b['b'] ='p-b'+str(c)
? ? a.append(ob_b.copy())
print(a)
OK,實現(xiàn)了想要的目標。
(深入的了解塞椎,python 有copy和deep copy的區(qū)別桨仿,對于簡單的對象copy 和 deep copy是相同的,但是涉及到多層次的對象就有區(qū)別了案狠,老鐵們自己去研究吧)