python对切片的赋值避免了修改迭代列表时出现的错误

2024-04-20 03:26:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我阅读了here,通过糟糕的代码了解到在循环中迭代列表和更改列表元素存在问题。他们建议一种方法是创建列表的副本:

for x in a[:]: # make a slice copy of the entire list
    if len(x) > 6: a.insert(0, x)

引用列表的一个片段是否会创建一个为执行循环而创建的临时副本?你知道吗

在下列情况下,如何找到here

somelist[:] = [x for x in somelist if not determine(x)]

在这种情况下,不是将解决方案分配给新列表,而是将输出分配给输入列表的一部分。这里的操作顺序是什么?为什么我们在通过通常的for循环修改列表元素时不会遇到前面提到的错误呢?你知道吗


Tags: 方法代码in元素列表formakeif
2条回答

语法someList[:]的意思略有不同,这取决于它是否出现在赋值的左侧。你知道吗

它本身someList[:]确实创建了一个(浅层)拷贝。你知道吗

someList[:] = ...使右侧的表达式替换列表的现有内容。未创建副本。现有列表的内容将被修改。你知道吗

你也可以把它看作someList[:]总是意味着同样的东西,那就是“列表的内容”。someList[:]自己创建一个副本,因为它给你列表的内容,而不是列表本身,所以它必须创建一个新的列表来“保存”这些内容。赋值给someList[:]会覆盖列表,因为它会替换现有列表的内容。你知道吗

这里调用了两种不同的方法(^{}^{}1)。它与操作顺序无关,但是上下文允许python选择应该调用哪个函数。在后一种情况下,“切片”位于赋值语句的左侧,这是调用__setitem__的原因。你知道吗

在列表中,这些方法可以做任何您想做的事情,__getitem__当使用slice对象调用时,会生成列表特定部分的副本,__setitem__当使用slice调用时,会将右侧插入到该切片中。你知道吗

1还有现在不推荐使用的^{}^{}方法

相关问题 更多 >