由于是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是相同的,但是涉及到多层次的对象就有区别了,老铁们自己去研究吧)