那是什么切片的整个列表,并直接分配片分配之间的区别?那是什么切片的整个列表,并直接分配片分配之间的区

2019-05-13 12:47发布

我看到在很多地方使用切片分配的list秒。 我能够用(非默认)指数使用时要了解其使用,但我无法理解它的使用,如:

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

如何从不同

a_list = ['foo', 'bar']

Answer 1:

a_list = ['foo', 'bar']

创建一个新的list在内存中,并指出名字a_list它。 这是无关紧要的东西a_list在之前指出。

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

调用__setitem__所述的方法a_list对象与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

但是,用“扩展切片”,其中step是不是一个,可迭代必须是正确的长度:

>>> 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. 没有名称是指向右边的对象。 如果有到任何其它引用(例如,当它是文字在你的例子),这将是引用计数出存在的迭代完成后。


Answer 2:

所不同的是相当庞大! 在

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

修改在绑定到名称的现有列表中a_list 。 另一方面,

a_list = ['foo', 'bar']

分配一个新的列表名称a_list

也许这将有所帮助:

a = a_list = ['foo', 'bar'] # another name for the same list
a_list = ['x', 'y'] # reassigns the name a_list
print a # still the original list

a = a_list = ['foo', 'bar']
a_list[:] = ['x', 'y'] # changes the existing list bound to a
print a # a changed too since you changed the object


Answer 3:

通过分配到a_list[:]a_list仍参照相同的列表对象,与修改的内容。 通过分配到a_lista_list现在引用到一个新的列表对象。

看看它的id

>>> a_list = []
>>> id(a_list)
32092040
>>> a_list[:] = ['foo', 'bar']
>>> id(a_list)
32092040
>>> a_list = ['foo', 'bar']
>>> id(a_list)
35465096

正如你所看到的,它的id好好尝试一下与片分配的版本变化。


不同的两者之间可能会导致完全不同的结果,例如,当列表的功能参数:

def foo(a_list):
    a_list[:] = ['foo', 'bar']

a = ['original']
foo(a)
print(a)

由此, a被修改为好,但如果a_list = ['foo', 'bar']代替实施例, a保持其原始值。



文章来源: What is the difference between slice assignment that slices the whole list and direct assignment?