python列表 += 与 + 的微妙差异

本文探讨了Python中列表操作符`+=`和`=`的不同行为。当使用`+=`扩展列表时,它在原地修改对象,而`=`则创建了一个新的列表对象并重新赋值给变量。这种区别在处理可变类型如列表时显得尤为重要,而在不可变类型如数字和字符串中,`+=`同样会创建新对象。
摘要由CSDN通过智能技术生成

直接上代码:

>>> lst1 = [1, 2, 3]
>>> lst2 = lst1
>>> lst3 = lst1
>>> id(lst1)
2241808741576
>>> id(lst2)
2241808741576
>>> id(lst3)
2241808741576
>>> lst2 += [4, 5]
>>> print(lst2)
[1, 2, 3, 4, 5]
>>> print(lst1)
[1, 2, 3, 4, 5]
>>> print(lst3)
[1, 2, 3, 4, 5]
>>> id(lst2)
2241808741576
>>> id(lst1)
2241808741576
>>> id(lst3)
2241808741576
  • 每个标识符与其所引用的对象的内存地址隐式相关联。python标识符 (可理解为变量名) 的语义非常类似于Java中的引用变量或C++中的指针变量。
  • lst1、lst2、lst3都是列表类对象 [1, 2, 3] 的别名,一旦建立了别名,这三个别名都可用来访问底层对象,即列表[1, 2, 3]
  • +=对于列表类型的操作:
  • 执行了,lst2 += [4, 5],由上面的IDLE运行结果发现,lst2的地址与执行命令之前是相同的,都是2241808741576,说明,列表对象在原地扩展了两个元素4,5.
>>> lst3 = lst3 + [6, 7]
>>> print(lst3)
[1, 2, 3, 4, 5, 6, 7]
>>> print(lst1)
[1, 2, 3, 4, 5]
>>> print(lst2)
[1, 2, 3, 4, 5]
>>> id(lst3)
2241808979208
>>> id(lst1)
2241808741576
>>> id(lst2)
2241808741576

上下代码段是连在一起的

  • =对于列表的操作:
  • 现在st1、lst2、lst3所指向的对象值为 [1, 2, 3, 4, 5]
  • 执行lst3 = lst3 + [6, 7],发现lst3结果为 [1, 2, 3, 4, 5, 6, 7],lst1和lst2的结果依然为 [1, 2, 3, 4, 5]
  • 查看lst1、lst2、lst3的id可知,lst1和lst2的地址依然没有改变,lst3的地址发生了改变
  • lst3 = lst3 + [6, 7] 并没有改变原有对象的值,而是新构造的对象 [1, 2, 3, 4, 5, 6, 7] 重新分配标识符(lst3),此时lst3不在是原对象的别名,是新构造对象的别名
  • 在列表类型中,+= 与 = 的对比:+=是在原地扩展元素=是构造新的对象,只是变量名依旧是原来的变量名(如lst3)
  • 对于不可变类型,如数字或字符串,+=并没有改变现有对象的值,而是构造了新的值重新分配了标识符。+=在列表(可变类型)中是一个特殊的情形。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值