初学者python中对象的copy问题

由于是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 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,241评论 4 16
  • 1. Python的hello-world: print ("Hello, Python!")、 完了 摇就完事儿...
    LunarShade阅读 1,512评论 0 0
  • 窗外淅淅沥沥落起雨来,清澈绵长的雨丝飘挂而下。路边的印度紫檀,对面的红屋顶,更远处的淡黄色大楼,还有那一角亮白色的...
    吾阿哇阅读 195评论 0 0
  • 下班
    王沫沫阅读 246评论 0 0