美文网首页
python for循环中的浅拷贝

python for循环中的浅拷贝

作者: jenye_ | 来源:发表于2021-07-16 14:02 被阅读0次

用习惯了C的循环,经常因为循环修改list的值产生bug,主要就是循环是进行浅拷贝的过程。

client_list = []
for i in range(0,10):
    params = {}
    params.update(
        num = i,
        name = 'a'
    )
    client_list.append(params)
for params in client_list:
    params.update(
        num = 0,
        name = 'test'
    )
    temp_d = {}
    temp_d['name'] = 'hello'
    params = temp_d

在对集合进行遍历的时候,为了节省空间,对于集合中的对象不会创建一个新的对象,如上图的params,而是存储该对象地址,所以对对象中的内容的修改会直接影响到原集合。

但如果直接修改params,则不会造成原集合的变化。


关于赋值、浅拷贝、深拷贝

  • 赋值:变量直接指向对象
ls = [i for i in range(0,10)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
lss = ls # [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
for idx,v in enumerate(lss):
    lss[idx] = 10
lss # [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
ls # [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
  • 浅拷贝:只拷贝父对象,不会拷贝对象中的子对象(而是引用地址)
ls = [[0,0,0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
lss = ls.copy() # [[0,0,0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
for idx in range(1,len(ls)):
    lss[idx] = 10
lss[0].append(99)
ls # [[0, 0, 0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
lss #  [[0, 0, 0, 99], 10, 10, 10, 10, 10, 10, 10, 10, 10]

需要注意的是,

ls = [[0,0,0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
lss = ls.copy() # [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
for idx in range(1,len(ls)):
    lss[idx] = 10

# 这里又做了一次浅拷贝,所以不会影响值    
for i in lss[0]:
    i = 99
ls # [[0, 0, 0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
lss # [[0, 0, 0], 10, 10, 10, 10, 10, 10, 10, 10, 10]
  • 深拷贝:完全拷贝,不会对原变量产生影响
ls = [[0,0,0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
lss = ls.copy() # [[0,0,0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
for idx in range(1,len(ls)):
    lss[idx] = 10
lss[0].append(99)
ls # [[0, 0, 0], 1, 2, 3, 4, 5, 6, 7, 8, 9]
lss # [[0, 0, 0, 99], 10, 10, 10, 10, 10, 10, 10, 10, 10]

相关文章

  • python for循环中的浅拷贝

    用习惯了C的循环,经常因为循环修改list的值产生bug,主要就是循环是进行浅拷贝的过程。 在对集合进行遍历的时候...

  • python 深拷贝与浅拷贝

    图解 Python 深拷贝和浅拷贝

  • Python中的引用赋值,深拷贝,浅拷贝

    摘要:Python,引用赋值,深拷贝,浅拷贝 总结一下Python中的变量的引用赋值,深拷贝和浅拷贝,先上结论 赋...

  • 简介深浅拷贝

    深浅拷贝 python 直接赋值,浅拷贝和深拷贝 直接赋值 其实就是对象的引用 (可以理解成浅拷贝) 浅拷贝: 拷...

  • Python底层|赋值 浅拷贝 深拷贝

    参考 python中的深拷贝和浅拷贝问题python的复制,深拷贝和浅拷贝的区别 结论 总体来说,赋值只是增加了一...

  • 谈谈python中的深拷贝和浅拷贝

    最近面试被问到python中深拷贝和浅拷贝的知识这里进行下总结,以便今后复习python中的深拷贝和浅拷贝和jav...

  • python中的拷贝

    Python中的拷贝分为两种,浅拷贝与深拷贝 浅拷贝:浅拷贝是对于一个对象的顶层拷贝。通俗的理解是:拷贝了引用,并...

  • python 深拷贝与浅拷贝的区别

    python中浅拷贝和深拷贝的区别如下: copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 ...

  • python(进阶一)

    三范式 GIL 深拷贝与浅拷贝 深拷贝 浅拷贝 跟引用的区别 python基本上如果提供了copy方法都是浅cop...

  • 简述三范式,GIL,浅拷贝与深拷贝

    三范式 GIL 深拷贝与浅拷贝 深拷贝 浅拷贝 跟引用的区别 python基本上如果提供了copy方法都是浅cop...

网友评论

      本文标题:python for循环中的浅拷贝

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