python神奇的运算符 [:]=

本文介绍了Python中的两种特殊运算符:[:]用于列表赋值但不改变引用,以及海象运算符:=用于简化表达式。通过实例展示了[:]=如何在上下文管理器中实现列表事务操作,确保只有在没有异常时才更新原始列表。同时,解释了海象运算符如何在条件语句中提前计算并赋值变量,提高代码的可读性。
摘要由CSDN通过智能技术生成

这个运算符应该是绝大多数人没见过

[:]=

要体会这个运算符的神奇之处在于,

这个赋值居然没有改变引用

例子

from contextlib import contextmanager


@contextmanager
def list_transaction(orig_list):
    working = list(orig_list)
    yield working
    orig_list[:] = working  

这是一个使用@contextmanager 装饰器的上下文管理器

  • yield 相当于 __enter__ 函数中的返回
  • yield行后的相当于 __exit__函数中的

list_transaction 函数的作用是一个事务列表:

with块中正常执行完(没有抛出异常), 才使用副本列表代替原来的列表

lst = [1, 2, 3]

with list_transaction(lst) as working:
	working.append(-1)

猜测 [:]= 的运作

可切片对象 [:]= 可迭代对象

>>> l
['a', 'b', 'c']

>>> l[:2]
['a', 'b']

>>> l[:2] = 'ddd'

>>> l
['d', 'd', 'd', 'c']'ddd' 替换列表的前两个对象
>>> l[1:3] = [1,2,3,4]

>>> l
['d', 1, 2, 3, 4, 'c']

在中间操作
如果还设置步长的话, 那就是 一个萝卜一个坑
>>> l[1:5:2] = 'xyz'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 3 to extended slice of size 2

>>> l[1:5:2] = 'xy'
>>> l
['a', 'x', 2, 'y', 4, 'd', 'e', 'd', 'c']

并且, 这样的运算, 全程id(l)都是不变的

即该列表的内存地址没有变化过

类似直接根据对象的引用进行操作

lst.append(item)
lst.pop()
lst.extend(iterable)

再介绍一个海象运算符

:=

my_list = [1,2,3]
count = len(my_list)
if count > 3:
   print(f"Error, {count} is too many items")

# 当转换为海象运算符时...
if (count := len(my_list)) > 3:
   print(f"Error, {count} is too many items")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值