附加到列表时的奇怪行为,而不是正确添加

时间:2016-12-22 05:03:15

标签: python

我只是不明白。请参阅下面的代码......

def startscan(rangeip,ports,cblocks):
    pool = ThreadPool(processes=MAX_THREADS)
    results = []
    testt = []
    #print(rangeip)
    #print(ports)
    #print(cblocks)
    for ii in range(cblocks):
     print(rangeip[2])
     rangeip[2] = int(rangeip[2]) + 1
     print(rangeip[2])
     print(rangeip)
     testt.append(rangeip)
    print(testt)

当我运行它时,它返回此输出:

root@node2nl home]# python g.py -r 192.168.20.1 -p 80 -a 3
20
21
['192', '168', 21, '1']
21
22
['192', '168', 22, '1']
22
23
['192', '168', 23, '1']

[['192', '168', 23, '1'], ['192', '168', 23, '1'], ['192', '168', 23, '1']]

你可以看到一切都是正确的,除了列表testt没有正确填充。它显示相同值的三倍。我需要它输出正确的结果,如下所示

[['192', '168', 21, '1'], ['192', '168', 22, '1'], ['192', '168', 23, '1']]

我做错了什么?这似乎是非常奇怪的事情。

2 个答案:

答案 0 :(得分:0)

rangerip列表附加了它的引用,而不是列表的副本。因此,结果在结尾处包含三次相同的引用。

您需要复制/克隆列表,有以下几种方法:

import copy
...
     testt.append(copy.copy(rangeip))
     #  or shorter rangerip[:]

请注意,另外修改了原始参数rangeip,这不是一个好习惯。您可以考虑在递增之前进行复制,而不是添加ii+1而不是1

答案 1 :(得分:0)

rangeip添加到列表中时,需要复制ttest。您的代码目前只是将列表的引用添加到rangeip列表三次,但不断更改ttest.append(rangeip)。将ttest.append(rangeip[:])替换为{{1}}以获得所需的结果。