添加到列表时的奇怪行为,不能正确添加

2024-10-03 06:22:41 发布

您现在位置: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']]

我做错什么了?这里好像发生了什么奇怪的事情


Tags: 代码fordefportsresultsmaxprocessesprint
2条回答

rangerip列表是由其引用附加的,而不是列表的副本。因此,结果在结尾包含三倍于同一引用的内容

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

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

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

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

相关问题 更多 >