2016-12-22 8 views
0

私はそれを手に入れません。リストに追加するときに、正しく追加しないときの奇妙な振る舞い

[email protected] 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が右いっぱいGETTしないリストを除いて正確である見ることができるように:私はそれを実行すると、それは、この出力を返します

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) 

...以下の私のコードを参照してください。同じ値の3倍の値を示します。以下のような適切な結果を出力する必要があります

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

私は間違っていますか?非常に奇妙なことが起こっているようです。

+0

あなたは 'ttest'リストに同じオブジェクト' rangeip'を追加していますので、 'ttest'のなかにはこのオブジェクトが参照する現在の値を格納する' rangeip'の複製だけがあります –

+0

簡単に ' testt.append(rangeip [:]) ' – TigerhawkT3

+0

私はあなたの答えを得るが、なぜそれが印刷で動作し、付加されていない。それは私が理解できない奇妙なことです。 –

答えて

0

rangeripリストには、リストのコピーではなく、その参照が追加されます。したがって、結果には同じ参照が最後に3回含まれます。良い習慣ではありません加えて元のパラメータrangeipが変更され

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

注:あなたが/コピーリストのクローンを作成する必要が

は、いくつかの方法があります。増分する前にコピーを行い、むしろ1の代わりにii+1を追加することを検討してください。

+0

私はそれを得ましたが、私の例でprint(rangeip)は正しい結果を返します:print(rangeip)==> ['192'、 '168'、21、 '1']何故ですか ? –

+0

@skanilos:現在の状態を表示するためです。しかし、現在のコンテンツは増分ごとに変化します。 –

+0

しかし、なぜtestt.append(rangeip)は現在のmodfied状態でrangeipを追加しないのですか?あなたが言及したように、印刷物が右の範囲を現在の状態で印刷するのと同じように。それは私にとっては不明瞭な部分です。 –

0

リストに追加するときはrangeipのコピーを作成する必要があります。あなたのコードは現在、リストへの参照をttestリストに3回追加しますが、変更は常にrangeipです。 ttest.append(rangeip)ttest.append(rangeip[:])に置き換えて、必要な結果を得てください。

+0

これはうまくいきました。しかし、私の元のコードでprint(rangeip)を使うと、正しいrangeipが返されるのはなぜですか? print(rangeip)==> ['192'、 '168'、21、 '1'] –