我阅读了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循环修改列表元素时不会遇到前面提到的错误呢?你知道吗
语法
someList[:]
的意思略有不同,这取决于它是否出现在赋值的左侧。你知道吗它本身
someList[:]
确实创建了一个(浅层)拷贝。你知道吗someList[:] = ...
使右侧的表达式替换列表的现有内容。未创建副本。现有列表的内容将被修改。你知道吗你也可以把它看作
someList[:]
总是意味着同样的东西,那就是“列表的内容”。someList[:]
自己创建一个副本,因为它给你列表的内容,而不是列表本身,所以它必须创建一个新的列表来“保存”这些内容。赋值给someList[:]
会覆盖列表,因为它会替换现有列表的内容。你知道吗这里调用了两种不同的方法(^{} 与^{} 1)。它与操作顺序无关,但是上下文允许python选择应该调用哪个函数。在后一种情况下,“切片”位于赋值语句的左侧,这是调用
__setitem__
的原因。你知道吗在列表中,这些方法可以做任何您想做的事情,
__getitem__
当使用slice对象调用时,会生成列表特定部分的副本,__setitem__
当使用slice调用时,会将右侧插入到该切片中。你知道吗1还有现在不推荐使用的^{} 和^{} 方法
相关问题 更多 >
编程相关推荐