python - 切片整个列表的切片赋值和直接赋值有什么区别?

标签 python list variable-assignment slice

我在很多地方看到 list 使用切片分配。当与(非默认)索引一起使用时,我能够理解它的用途,但我无法理解它的用途,例如:

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

这和它有什么不同

a_list = ['foo', 'bar']

?

最佳答案

a_list = ['foo', 'bar']

在内存中创建一个新的 list 并将名称 a_list 指向它。 a_list 之前指向的内容无关紧要。

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

调用__setitem__ a_list 对象的方法,带有 slice作为索引,并在内存中创建一个新的 list 作为值。

__setitem__ 评估 slice 以确定它代表的索引,并在它传递的值上调用 iter。然后它遍历对象,将 slice 指定范围内的每个索引设置为对象的下一个值。对于 lists,如果 slice 指定的范围与 iterable 的长度不同,则 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

但是,对于“扩展切片”,其中 step 不是一个,iterable 必须是正确的长度:

>>> 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. 没有名称指向右侧的对象。如果没有其他对它的引用(例如当它是您的示例中的文字时),它将在迭代完成后被计数为不存在。

关于python - 切片整个列表的切片赋值和直接赋值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155951/

相关文章:

python - 无法让 tkinter 窗口标题从 'tk' 更改

python - 如何创建一个 numpy 数组,其中填充另一个数组元素的差异

python - 根据项目列表中元素的顺序从键列表和项目列表创建字典

python - 从元组列表中,获取最接近给定值的元组

C++ - 为什么对同一对象的 2 个本地引用保持同步?

c - 这段代码是否会导致内存泄漏

python - 在 eclipse 中缩进 python 文件(使用 pydev)

python - 异常值 : ('08001' , '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)' )

asp.net - 无法将列表框中的项目添加到列表

Javascript的赋值操作是复制引用?