对整个列表进行切片的切片分配与直接分配之间有什么区别?

对整个列表进行切片的切片分配与直接分配之间有什么区别?,第1张

对整个列表进行切片的切片分配与直接分配之间有什么区别?
a_list = ['foo', 'bar']

list
在内存中创建一个新名称
a_list
,并指向该名称。
a_list
前面所指的是无关紧要的。

a_list[:] = ['foo', 'bar']

调用对象

__setitem__
方法,
a_list
以a
slice
作为索引,并
list
在内存中创建一个新值作为值。

__setitem__
评估
slice
以确定它代表什么索引,并调用
iter
它传递的值。然后,它会在对象上进行迭代,将所指定范围内的每个索引设置为该对象
slice
的下一个值。对于
list
s,如果由所指定的范围
slice
的长度与可迭代的长度不同,则将
list
调整的大小。这使您可以做很多有趣的事情,例如删除列表的各个部分:

a_list[:] = [] # deletes all the items in the list, equivalent to 'del a_list[:]'

或在列表中间插入新值:

a_list[1:1] = [1, 2, 3] # inserts the new values at index 1 in the list

但是,对于“ extended slices”,如果

step
不能为1,则可迭代的长度必须正确:

>>> lst = [1, 2, 3]>>> lst[::2] = []Traceback (most recent call last):  File "<interactive input>", line 1, in <module>ValueError: attempt to assign sequence of size 0 to extended slice of size 2

切片分配的主要不同之处在于

a_list

  1. a_list
    必须已经指向一个对象
  2. 该对象被修改,而不是指向
    a_list
    新对象
  3. 这个对象必须支持
    __setitem__
    slice
    指数
  4. 右边的对象必须支持迭代
  5. 没有名称指向右边的对象。如果没有其他引用(例如,如您的示例中的文字所示),则在迭代完成后,该引用将不存在。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5617265.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存