如何在不复制引用的情况下在Python中对列表进行切片?

时间:2013-12-10 17:51:36

标签: python list slice

我需要从函数内的列表中删除前N个元素,并且我希望修改原始列表。在Python中执行此操作的简洁方法是什么?

使用slice不起作用,因为切片操作会返回对列表的单独引用。在此示例中,我希望在调用函数后pkt[3,4,5]

>>>> def process_packet(packet, num_bytes):
         # ...
         packet = packet[num_bytes:len(packet)]
         print packet

>>> pkt = [1,2,3,4,5]
>>> process_packet(pkt, 2)
[3, 4, 5]
>>> print pkt
[1, 2, 3, 4, 5]

5 个答案:

答案 0 :(得分:7)

只需使用del删除切片:)

>>> def process_packet(packet, num_bytes):
...     del packet[num_bytes:len(packet)]
... 
>>> a = range(10)
>>> process_packet(a,4)
>>> a
[0, 1, 2, 3]

答案 1 :(得分:4)

在里面使用切片表示法:

def process_packet(packet, num_bytes):
    packet[:] = packet[num_bytes:len(packet)]
    print packet

>>> pkt = [1,2,3,4,5]
>>> process_packet(pkt, 2)
[3, 4, 5]
>>> print pkt
[3, 4, 5]

请注意,仅当packet是列表或兼容的可迭代时,此方法才有效。列表的初始和最终长度可能不同,(越来越大,或者反之亦然)。

答案 2 :(得分:1)

在功能结束时添加return packet

当您调用函数时,请调用它:pkt = process_packet(pkt,2)

答案 3 :(得分:0)

您可以使用collections模块中的deque和popleft num_bytes次,或者创建一个修改self.pkt的类,或者最简单的方法是:

def process_packet(pkt, num):
    return pkt[num:]

pkt = process_packet(pkt, 2)

只需返回数据包,然后重新分配即可。这可能是您最常看到的处理这种逻辑的原因。

答案 4 :(得分:0)

阅读Python: How do I pass a variable by reference?的答案。在那里,您将找到理解Python如何将参数传递给函数所需的内容。稍后您将自己找到问题的答案。