Python 使用列表理解分配给列表[:]
从这个答案 我试图找出使用Python 使用列表理解分配给列表[:],python,list-comprehension,slice,Python,List Comprehension,Slice,从这个答案 我试图找出使用 somelist = [1,2,3,4,5,6,7,8,9] somelist = [x for x in somelist if x>4] and somelist[:] = [x for x in somelist if x>4] 在他的回答中,他说 或者,通过分配给切片somelist[:],可以改变现有的 仅包含所需项目的列表: “to contain only”4]只是过滤。 for循环将此列表中的每个元素分配给一个临时变量x 然后(在此循环
somelist = [1,2,3,4,5,6,7,8,9]
somelist = [x for x in somelist if x>4]
and
somelist[:] = [x for x in somelist if x>4]
在他的回答中,他说
或者,通过分配给切片somelist[:],可以改变现有的
仅包含所需项目的列表:
“to contain only”<我可以使用assign来分配somelist而无需切片
那么somelist[:]需要什么呢@jonsharpe在评论中给出了一个简短的回答,但为了清楚地说明这一点: 分配一个新的列表。丢失对旧列表对象的引用,并创建一个新对象:
>>> lst1 = [[1, 2, 3],[4, 5, 6]]
>>> lst2 = lst1
>>> lst1 = [[7,8,9]]
>>> lst1 is lst2
False
>>> lst1
[[7, 8, 9]]
>>> lst2
[[1, 2, 3], [4, 5, 6]]
分配给切片替换列表(或列表的一部分,取决于切片的内容),保留相同的对象
>>> lst1 = [[1, 2, 3],[4, 5, 6]]
>>> lst2 = lst1
>>> lst1[:] = [[7,8,9]]
>>> lst1 is lst2
True
>>> lst1
[[7, 8, 9]]
>>> lst2
[[7, 8, 9]]
类似于
somelist=[1,2,3,4,5,6,7,8,9]
的指令创建一个新列表
将它(整个列表)分配给变量(somelist
)
第二种情况,somelist=[x为x,如果x>4]
只是过滤。
for
循环将此列表中的每个元素分配给一个临时变量x
然后(在此循环内)if
检查此(当前)元素是否满足
某些条件,在您的情况下,是否大于4
只有当它是时,这个元素才会被添加到新的数组中,最终将
分配给somelist
现在,普通赋值(仅限于somelist
)之间的区别是什么
和切片分配(到somelist[:]
)
假设最初有otherList
,您创建了somelist
使用普通赋值:somelist=otherList
实际上,没有创建第二个列表,但是somelist
可以被视为
另一个指向第一个列表的“指针”
换句话说,otherList
和somelist
都指向相同的
对象(在本例中为数组)
然后,在代码的后面,如果使用somelist[:]=…
编写新内容
要相同的内部对象,也可以使用otherList
(例如,在代码的其他部分)
但如果使用普通赋值(somelist=…
),则:
- 创建了一个新的内部对象(数组)和
点 就这样somelist
- 旧的内容仍然作为
可见otherList
已收集。分配给
somelist
不会更改该名称所指的列表,而分配给somelist[:]
则会更改该名称所指的列表。哪一个适合你的情况将取决于你需要的细节。@leo他说“替换列表并保留相同的对象..直到你以更好的方式解释才清楚..谢谢大家,谢谢