目录
  • 1. 基本使用
  • 2. 任意类型元素
  • 3. 列表同步
    • 3.1 原理剖析
    • 3.2 解决方案
  • 4. append()与extend()的区别
    • 总结

      1. 基本使用

      append() 函数可以向列表末尾添加元素

      语法

      list.append( element )
      

      参数

      • element:任何类型的元素

      实例:向列表末尾添加一个元素

      name_list = ['zhangsan', 'lisi', 'wangwu']
      name_list.append('zhaoliu')
      print(name_list)
      

      输出:

      ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']

      需要注意的是, append() 函数添加的元素在列表的「末尾」而不是任意位置

      2. 任意类型元素

      append() 函数可以向列表末尾添加「任意类型」的元素

      实例:添加普通类型(数值、字符串)元素

      list1 = ['zhangsan', 'lisi', 'wangwu']
      list1.append(1)  # 添加整形
      print(list1)
      list1.append('str')  # 添加字符型
      print(list1)
      

      输出:

      ['zhangsan', 'lisi', 'wangwu', 1]
      ['zhangsan', 'lisi', 'wangwu', 1, 'str']

      实例:添加集合类型(列表,元祖)元素

      list1 = ['zhangsan']
      list1.append([1,2,3])  # 添加列表
      print(list1)
      list1.append((4,5,6))  # 添加元祖
      print(list1)
      

      输出:

      ['zhangsan', [1, 2, 3]]
      ['zhangsan', [1, 2, 3], (4, 5, 6)]

      3. 列表同步

      使用 append() 函数添加列表时,是添加列表的「引用地址」而不是添加列表内容,当被添加的列表发生变化时,添加后的列表也会同步发生变化。

      list1 = ['zhangsan']
      a = [1,2,3]
      list1.append(a)  # 列表list1添加列表a
      print(list1)
      a.append(4)  # 列表a发生变化
      list1.append(a)
      print(list1)  # 列表list1也会同步变化
      

      输出:

      ['zhangsan', [1, 2, 3]]
      ['zhangsan', [1, 2, 3, 4], [1, 2, 3, 4]]

      3.1 原理剖析

      从输出结果可以发现,当添加的列表发生变化时,先前添加的内容也发生了改变,这会使程序出现意料之外的问题,我们使用 id() 函数验证一下

      list1 = ['zhangsan']
      a = [1,2,3]
      list1.append(a)
      print(a, id(a))  # 列表a的引用地址
      print(list1[1], id(list1[1]))  # 添加到列表后的引用地址
      

      输出:

      [1, 2, 3] 2992145244608
      [1, 2, 3] 2992145244608

      3.2 解决方案

      从输出结果可以看出,问题的原因就在引用地址上面。这里补充两个概念

      • 浅拷贝:拷贝这个对象的引用地址
      • 深拷贝:拷贝对象的内容

      使用 copy.deepcopy() 函数深拷贝列表的内容而不是列表的引用地址

      list1 = ['zhangsan']
      a = [1,2,3]
      list1.append(copy.deepcopy(a))
      print(a, id(a))  # 列表a的引用地址
      print(list1[1], id(list1[1]))  # 添加到列表后的引用地址
      

      输出:

      [1, 2, 3] 1963457096704
      [1, 2, 3] 1963458936640

      由输出结果可以确定,添加后的列表不再引用源列表的地址

      使用「深拷贝」添加列表的内容而不是引用地址,从而解决列表同步的问题

      list1 = ['zhangsan']
      a = [1,2,3]
      list1.append(copy.deepcopy(a))  # 深拷贝列表a
      print(list1)
      a.append(4)  # 列表a发生变化
      list1.append(copy.deepcopy(a))  # 深拷贝列表a
      print(list1)  # 列表list1不再同步变化
      

      输出:

      ['zhangsan', [1, 2, 3]]
      ['zhangsan', [1, 2, 3], [1, 2, 3, 4]]

      列表同步问题解决了

      4. append()与extend()的区别

      1. append添加的是元素本身,而extend添加的是元素的值
      2. append可以添加所有类型元素,而extend只能添加序列

      比如,添加列表时,append会添加整个列表,而extend只会添加列表中的值

      list1 = ['zhangsan', 'lisi', 'wangwu']
      list2 = ['zhangsan', 'lisi', 'wangwu']
      list1.append([1,2,3])
      print('append添加整个列表:', list1)
      list2.extend([1,2,3])
      print('extend添加列表的值:', list2)
      

      输出:

      append添加整个列表: ['zhangsan', 'lisi', 'wangwu', [1, 2, 3]]
      extend添加列表的值: ['zhangsan', 'lisi', 'wangwu', 1, 2, 3]

      总结

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。