我看到在很多地方使用切片分配的list
秒。 我能够用(非默认)指数使用时要了解其使用,但我无法理解它的使用,如:
a_list[:] = ['foo', 'bar']
如何从不同
a_list = ['foo', 'bar']
?
我看到在很多地方使用切片分配的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
从对象的下一个值。 对于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
是:
a_list
必须已经指向一个对象 a_list
在一个新的对象 __setitem__
用slice
指数 所不同的是相当庞大! 在
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
通过分配到a_list[:]
, a_list
仍参照相同的列表对象,与修改的内容。 通过分配到a_list
, a_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
保持其原始值。