我只是不明白。请参阅下面的代码......
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']]
我做错了什么?这似乎是非常奇怪的事情。
答案 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}}以获得所需的结果。