python append引起的后续

在写公司web系统后台的时候,发现前端收到一个list的值是重复的,到后台看下代码,才想起一个深拷贝与浅拷贝的问题。

这个问题应该在初学python的时候会遇到,平时也要多注意检查自身的代码才行。

场景模拟:

a = []

b = {}
for i in range(0, 3):
    b = {} #这个地方注释与否会有不同的结果
    print i
    print a
    print b
    b['a'] = i
    a.append(b)
    print a
print b
print a


原理:
dict(字典)赋给list的是一个位置,对于第一种代码,b定义在循环外,a.append(b)赋给a的都是相同的位置,而在同一位置的b的值已经改变了,所以a取到的之前位置的值改变了,表现出后面数据覆盖前面数据的表象。b定义在循环内,相当于每一次循环生成一个b占用不同的位置存储值,所以可以赋给a不同元素不同的位置,获得不同的值。


深拷贝与浅拷贝:

Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。

区别:

        1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 
        2. copy.deepcopy 深拷贝 拷贝对象及其子对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值