【python】+ 和 append的区别

部署运行你感兴趣的模型镜像

在 Python 中,+append() 都可以用于操作列表,但两者的行为、作用对象和性能差异显著。以下是具体区别和适用场景的总结:


1. 修改方式与返回类型

  • + 运算符

    • 创建新列表+ 会将两个列表合并为一个 新列表,原列表不变。
      a = [1, 2]
      b = a + [3]  # 新列表 [1, 2, 3],a 仍为 [1, 2]
      
    • 返回新对象:操作后需将结果赋值给变量,否则原列表不会被修改。
    • 适用场景:需保留原列表时(如生成新数据集或避免副作用)。
  • append() 方法

    • 原地修改:直接在原列表末尾添加单个元素(整体添加,不拆解)。
      a = [1, 2]
      a.append([3])  # 原列表变为 [1, 2, [3]]
      
    • 无返回值:返回 None,因此不能用于链式操作(如 a.append(3).append(4) 会报错)。
    • 适用场景:需高效修改原列表(如动态收集数据)。

2. 作用对象的差异

  • + 处理可迭代对象

    • 要求两侧均为可迭代对象(如列表、元组),否则报错:
      a = [1, 2]
      a + 3  # 报错,需改为 a + [3]
      
  • append() 添加任意对象

    • 可将任意类型(包括列表、字典等)作为 单个元素 添加到列表末尾:
      a = [1, 2]
      a.append({"key": "value"})  # 列表变为 [1, 2, {'key': 'value'}]
      

3. 性能与效率

  • 时间复杂度

    • + 的时间复杂度为 O(n),因为需要复制原列表并创建新对象,频繁使用(如循环中)会导致性能问题。
    • append() 的时间复杂度为 O(1),仅修改列表末尾指针,适合高频操作。
  • 内存占用

    • + 每次操作都会占用新内存,而 append() 仅在列表扩容时触发内存重新分配(Python 内部优化机制)。

4. 函数默认参数中的陷阱

  • append() 的副作用

    def func(a, lst=[]):
        lst.append(a)
        return lst
    
    func(1)  # 返回 [1]
    func(2)  # 返回 [1, 2](原列表被保留并修改)
    
    • 原因:默认参数 lst=[] 在函数定义时创建,多次调用共享同一列表。
  • + 的独立性

    def func(a, lst=[]):
        lst = [a] + lst
        return lst
    
    func(1)  # 返回 [1]
    func(2)  # 返回 [2](每次新建列表)
    
    • 原因lst = [a] + lst 创建了新列表,原默认参数不受影响。

5. 特殊场景与替代方案

  • 嵌套列表操作

    • append() 可能导致嵌套结构(如 [[1, 2], 3]),而 extend() 可展开可迭代对象(如 [1, 2, 3])。
    • 示例:
      a = [1, 2]
      a.extend([3, 4])  # 原列表变为 [1, 2, 3, 4]
      
  • 列表推导式中的差异

    temp = [[1, 2], [3, 4]]
    # append() 修改原列表,返回 None 列表
    [e.append(5) for e in temp]  # temp 变为 [[1, 2, 5], [3, 4, 5]]
    # + 生成新列表,原列表不变
    new_list = [e + [5] for e in temp]  # new_list 为 [[1, 2, 5, 5], [3, 4, 5, 5]]
    

在这里插入图片描述

总结建议

  • 优先选择 append():当需要原地修改列表且不关心返回值时(如循环中添加元素)。
  • 慎用 +:仅在需要保留原列表或合并多个列表时使用(注意性能问题)。
  • 替代方案extend() 用于批量添加元素,insert() 用于指定位置插入。

通过合理选择操作符或方法,可显著提升代码效率和可读性。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Next2you

你真帅!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值