初学者python中对象的copy问题

作者: StillWater_7e10 | 来源:发表于2018-02-11 00:08 被阅读5次

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

    相关文章

      网友评论

        本文标题:初学者python中对象的copy问题

        本文链接:https://www.haomeiwen.com/subject/ycahtftx.html