由于是python的新手,對python的理解還不夠深,在爬取數據時遇到了不小的麻煩。
我把代碼簡化如下:
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. ?各個對象的值根據迭代中的C值變化。
但是實際輸出,多個對象的值是相同的。
這個問題糾結了我很久,最后從官方文檔發現,原來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的值沒有變化
為什么會出現這種情況呢,原來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),內里的值發生了改變,指向該值的b也會相應的發生改變。
好了這就是為什么我第一段代碼會生成對象完全相同的原因。怎么解決呢,需要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,實現了想要的目標。
(深入的了解,python 有copy和deep copy的區別,對于簡單的對象copy 和 deep copy是相同的,但是涉及到多層次的對象就有區別了,老鐵們自己去研究吧)