外贸人该懂点儿技术 - Magento2 篇程序员

初学者python中对象的copy问题

2018-02-11  本文已影响5人  StillWater_7e10

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

上一篇 下一篇

猜你喜欢

热点阅读