zoukankan      html  css  js  c++  java
  • day5_不能循环删除list-深拷贝、浅拷贝(import copy)

    一、循环删list里面的元素,会导致下标错位,结果是不对的举例:想删除奇数

    l = [1,1,1,2,3,4,5]
    for i in l:
        if i%2 !=0:
            l.remove(i)  #删除后,导致下标错位了,有的值被错过了不会被删除。
    print(l)

    结果:

    [1, 2, 4]

     可解决方式:

    l = [1,1,1,2,3,4,5]
    l2 = [1,1,1,2,3,4,5] #在定义个l2和l相同
    for i in l2: #循环的是l2
        if i%2 !=0:
            l.remove(i)  #删除的是l
    print(l)

    结果:

    [2, 4]

    list里面的copy()方法也是浅拷贝

    引发出问-深拷贝、浅拷贝

    二、深拷贝、浅拷贝

    深拷贝会开辟新的内存地址,浅拷贝不会用一个内存地址

    l = [1,1,1,2,3,4,5] #跟深拷贝一样
    l2 =l #浅拷贝#这种不行,l存的实际是内存地址,l2又定义了个变量,把l赋值给l2,说明l2指向的内存地址和l相同。l删除后,l2也删除了,因为用的是一块儿内存地址
    查看内存地址;print(id(l))
    import copy  #引入模块-深拷贝功能

    1、‘=’:用等号来赋值,新的变量和原来的变量实际上指向的是同一个地址,等号连接起来的变量互相影响

    2、浅拷贝copy

    注:import copy后使用的copy函数和python自带的copy函数作用是相同的(copy.copy(x)=x.copy())

    拷贝原list变量的第一层,之后对新变量或者旧变量的第一层的修改不会影响到彼此,第二层以及更多层之间则是像第一中操作中一样,是互相影响的。什么是第一层呢

    l =[1,2,[3,4]]

    那么1,2,[3,4]都属于第一层的元素,在新变零中修改第一层的元素不会影响到原变量,同样,在原变量中修改第一层的元素也不会影响到新变量;而3,4属于第第二层中的元素,对他们修改会影响到用浅拷贝连接起来的所有变量中的第二层元素: 

    修改原变量观察对新变量的影响:

    import copy
    l =[1,2,[3,4]]
    l2 = copy.copy(l) #copy()函数,
    l3   = l.copy()  #列表自带的copy()方法
    l[0] =0
    l[2][0]=9
    print('l=',l)
    print('l2=',l2)
    print('l3 =',l3)

    输出:

    l= [0, 2, [9, 4]]
    l2= [1, 2, [9, 4]]
    l3 = [1, 2, [9, 4]]

    修改新变量,对原变量的影响:

    l =[1,2,[3,4]]
    l2 = copy.copy(l) #copy()函数,
    l3   = l.copy()  #列表自带的copy()方法
    l2[0] =0
    l2[2][0]=9
    print('l=',l)
    print('l2=',l2)
    print('l3 =',l3)

    输出:

    l= [1, 2, [9, 4]]
    l2= [0, 2, [9, 4]]
    l3 = [1, 2, [9, 4]]

     

    3、深拷贝deepcopy

    复制出来的与原来的变量没有任何关系,最清爽的复制

    import copy
    l = [1,1,1,2,3,4,5]
    l2 = copy.deepcopy(l) #深拷贝
    print(id(l))
    print(id(l2))

    结果:

    18649160
    18553288

    字符串/元组的拷贝问题说明:字符串是不可变的。

    a = '小黑'
    b = a  #重新开辟了新内存,不会像list一样,和a用一个内存地址
    a = '小白' #a重新复制不会互相影响
    print(a)
    print(b)

    输出:

    小白
    小黑
  • 相关阅读:
    Appium安装说明
    解决上传到github报错Successfully created project 'autotest' on GitHub, but initial commit failed:
    解决Robot Framework运行时没有Log的方案
    Robot Framework问题汇总...不断更新中
    Jmeter常见问题汇总(不断更新ing)
    自动化测试基础篇--小结
    自动化测试基础篇--Selenium发送测试报告邮件
    自动化测试基础篇--Selenium unittest生成测试报告(HTMLTestRunner)
    自动化测试基础篇--Selenium unittest简介
    自动化测试基础篇--Selenium框架设计(POM)
  • 原文地址:https://www.cnblogs.com/once-again/p/9622465.html
Copyright © 2011-2022 走看看