• Python list添加元素的方法及区别


    前面章节介绍了很多关于 list 列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有 append() 和 extend(),删除元素功能的有 clear()、 remove()、pop() 和 del 关键字。

    本节将通过实例演示的方式来明确各个函数的用法,以及某些函数之间的区别和在使用时的一些注意事项。

    Python list添加元素的方法及区别

    定义两个列表(分别是 list1 和 list3),并分别使用 +、extend()、append() 对这两个 list 进行操作,其操作的结果赋值给 l2。实例代码如下:https://www.furuihua.cn/shenzhen/shajing/

    1. tt = 'hello'
    2. #定义一个包含多个类型的 list
    3. list1 = [1,4,tt,3.4,"yes",[1,2]]
    4. print(list1,id(list1))
    5. print("1.----------------")
    6. #比较 list 中添加元素的几种方法的用法和区别
    7. list3 = [6,7]
    8. l2 = list1 + list3
    9. print(l2,id(l2))
    10. print("2.----------------")
    11. l2 = list1.extend(list3)
    12. print(l2,id(l2))
    13. print(list1,id(list1))
    14. print("3.----------------")
    15. l2 = list1.append(list3)
    16. print(l2,id(l2))
    17. print(list1,id(list1))

    输出结果为:

    [1, 4, 'hello', 3.4, 'yes', [1, 2]] 2251638471496
    1.----------------
    [1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251645237064
    2.----------------
    None 1792287952
    [1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7] 2251638471496
    3.----------------
    None 1792287952
    [1, 4, 'hello', 3.4, 'yes', [1, 2], 6, 7, [6, 7]] 2251638471496

    根据输出结果,可以分析出以下几个结论:

    1. 使用“+”号连接的列表,是将 list3 中的元素放在 list 的后面得到的 l2。并且 l2 的内存地址值与 list1 并不一样,这表明 l2 是一个重新生成的列表。
    2. 使用 extend 处理后得到的 l2 是 none。表明 extend 没有返回值,并不能使用链式表达式。即 extend 千万不能放在等式的右侧,这是编程时常犯的错误,一定要引起注意。
    3. extend 处理之后, list1 的内容与使用“+”号生成的 l2 是一样的。但 list1 的地址在操作前后并没有变化,这表明 extend 的处理仅仅是改变了 list1,而没有重新创建一个 list。从这个角度来看,extend 的效率要高于“+”号。
    4. 从 append 的结果可以看出,append 的作用是将 list3 整体当成一个元素追加到 list1 后面,这与 extend 和“+”号的功能完全不同,这一点也需要注意。

    Python list删除操作

    接下来演示有关 del 的基本用法,实例代码如下:

    1. tt = 'hello'
    2. #定义一个包含多个类型的 list
    3. list1 = [1,4,tt,3.4,"yes",[1,2]]
    4. print(list1)
    5. del list1[2:5]
    6. print(list1)
    7. del list1[2]
    8. print(list1)

    输出结果为:

    [1, 4, 'hello', 3.4, 'yes', [1, 2]]
    [1, 4, [1, 2]]
    [1, 4]

    这 3 行输出分别是 list1 的原始内容、删除一部分切片内容、删除指定索引内容。可以看到,del 关键字按照指定的位置删掉了指定的内容。

    需要注意的是,在使用 del 关键字时,一定要搞清楚,删除的到底是变量还是数据。例如,下面代码演示和删除变量的方法:

    1. tt = 'hello'
    2. #定义一个包含多个类型的 list
    3. list1 = [1,4,tt,3.4,"yes",[1,2]]
    4. l2 = list1
    5. print(id(l2),id(list1))
    6. del list1
    7. print(l2)
    8. print(list1)

    运行结果如下:

    1765451922248 1765451922248
    [1, 4, 'hello', 3.4, 'yes', [1, 2]]
    Traceback (most recent call last):
      File "C:UsersmengmaDesktopdemo.py", line 8, in <module>
        print(list1)
    NameError: name 'list1' is not defined

    第一行输出的内容是 l2 和 list1 的地址,可以看到它们是相同的,说明 l2 和 list1 之间的赋值仅仅是传递内存地址。接下来将 list1 删掉,并打印 l2,可以看到,l2 所指向的内存数据还是存在的,这表明 del 删除 list1 时仅仅是销毁了变量 list1,并没有删除指定的数据。

    除了删除变量,其他的删除都是删除数据,比如将列表中数据全部清空,实现代码如下:

    1. tt = 'hello'
    2. #定义一个包含多个类型的 list
    3. list1 = [1,4,tt,3.4,"yes",[1,2]]
    4. l2 = list1
    5. l3 = l2
    6. del l2[:]
    7. print(l2)
    8. print(l3)

    输出结果为:

    []
    []

    可以看到,l3 和 l2 执行同样的内存地址,当 l2 被清空之后,l3 的内容也被清空了。这表明内存中的数据真正改变了。

    另外,在实际过程中,即便使用 del 关键字删除了指定变量,且该变量所占用的内存再没有其他变量使用,此内存空间也不会真正地被系统回收并进行二次使用,它只是会被标记为无效内存。

    如果想让系统回收这些可用的内存,需要借助 gc 库中的 collect() 函数。例如:

    1. #引入gc库
    2. import gc
    3. tt = 'hello'
    4. #定义一个包含多个类型的 list
    5. list1 = [1,4,tt,3.4,"yes",[1,2]]
    6. del list1
    7. #回收内存地址
    8. gc.collect()

    前面我们在《Python缓存机制》一节讲过,系统为了提升性能,会将一部分变量驻留在内存中。这个机制对于,多线程并发时程序产生大量占用内存的变量无法得到释放,或者某些不再需要使用的全局变量占用着大的内存,导致后续运行中出现内存不足的情况,此时就可以使用 del 关键字来回收内存,使系统的性能得以提升。同时,它可以为团队省去扩充大量内存的成本。

  • 相关阅读:
    switch能否作用在作用在byte、long、string上面?
    websocket(转)
    equal和hashcode、==
    List常用方法
    String,Integer,Double等类型互相转换
    BigDecimal的转换和使用
    gitHub常用命令和技巧
    SQL语句
    SpringBoot注解
    vue格式化时间
  • 原文地址:https://www.cnblogs.com/furuihua/p/12582677.html
Copyright © 2020-2023  润新知