跳转至

+ += append extend 的区别


def test1(li):
    """使用+操作两个列表"""
    raw_li = li
    print(f'原始li: \t{raw_li}')

    li  = li + li
    print(f'使用+操作后: \t{li}')

    print(f'原始li: \t{raw_li}')
    print()


def test2(li):
    """使用+=操作列表"""
    raw_li = li
    print(f'原始li: \t{raw_li}')

    li += li
    print(f'使用+=操作后: \t{li}')

    print(f'原始li: \t{raw_li}')
    print()


def test3(li: list):
    """使用append操作列表"""
    raw_li = li
    print(f'原始li: \t\t{raw_li}')

    li.append(4)
    print(f'使用append操作后: \t{li}')

    print(f'原始li: \t\t{raw_li}')
    print()


def test4(li: list):
    """使用extend操作列表"""
    raw_li = li
    print(f'原始li: \t\t{raw_li}')

    li.extend(li)
    print(f'使用extend操作后: \t{li}')

    print(f'原始li: \t\t{raw_li}')


def main():
    li = [1, 2, 3]
    test1(li)

    li = [1, 2, 3]
    test2(li)

    li = [1, 2, 3]
    test3(li)

    li = [1, 2, 3]
    test4(li)


if __name__ == '__main__':
    main()

输出:

原始li:         [1, 2, 3]
使用+操作后:     [1, 2, 3, 1, 2, 3]
原始li:         [1, 2, 3]

原始li:         [1, 2, 3]
使用+=操作后:    [1, 2, 3, 1, 2, 3]
原始li:         [1, 2, 3, 1, 2, 3]

原始li:                 [1, 2, 3]
使用append操作后:        [1, 2, 3, 4]
原始li:                 [1, 2, 3, 4]

原始li:                 [1, 2, 3]
使用extend操作后:        [1, 2, 3, 1, 2, 3]
原始li:                 [1, 2, 3, 1, 2, 3]

解释:

  • 对于可变数据类型, 函数内部对其进行 +=、append和extend操作, 会更改原始数据

  • 而 li=li+li, 则是在函数内部创建了一局部变量li, 不会对外面的li造成影响

  • += 内部使用了魔法方法__iadd__, __iadd__内部又调用了extend方法

拓展:

  • + 只能操作类型一直的对象, 例如列表+列表, 如果是列表+远足, 则提示TyperError

  • extend方法传入参数是可迭代对象(iterable), 所以可以 列表.extend(元组)、元组.extend(集合)等等