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
    可见
正如Jornsharpe所指出的,使用哪个选项取决于 您的应用程序真正需要什么

在最简单的情况下,如果没有其他变量指向“old” 数组,可以使用普通赋值(IMHO是一个更自然的选项)和 旧数组(现在没有来自任何其他变量的引用)将成为垃圾
已收集。

分配给
somelist
不会更改该名称所指的列表,而分配给
somelist[:]
则会更改该名称所指的列表。哪一个适合你的情况将取决于你需要的细节。@leo他说“替换列表并保留相同的对象..直到你以更好的方式解释才清楚..谢谢大家,谢谢