2017-03-23 4 views
0
def generateNew(data): 

    for i in range(len(data)-1): 
     data[i].append(data[i+1][2]) 
    data[-1].append(oP) 

    for i in range(len(data)-1): 
     data[i].append(data[i+1][0]) 
     data[i].append(data[i+1][1]) 
    data[-1].append(hlP[0]) 
    data[-1].append(hlP[1]) 

    for i in range(len(data)-1): 
     data[i].append(data[i+1][4]) 
    data[-1].append(volume) 

    new = [hlP[0], hlP[1], oP, cP, volume] 
    print new 
    return new 

dataSet = [] 
for i in f.readlines(): 
    i = i.split(',') 
    x = [float(j) for j in i[1:-1]] 
    x.append(int(i[-1])) 
    dataSet.append(x) 
dataSet.reverse() 
mData = dataSet # for next loop, append new set 

for i in range(10): 
    temp = predictNew(mData) 
    print dataSet 
    dataSet.append(temp) 
    mData = dataSet 

ここは私のコードです。 dataSet[[1,2,3,4],[1,2,3,4]....]と同じですが、それをmDataに割り当て、それを関数generateNewに渡します(必要でない詳細の一部を削除します)。リストは今度は[[1,2,3,4,5,6],[1,2,3,4,5,6]....]のようになります。しかし、私はdataSetと 'mData'のどちらも、関数内ですべての変更が行われるため変更してはいけないと思います。その事実はそうではありません。誰も私になぜそれを教えて、改善することができますか? ありがとうございます。関数は呼び出されずに変数をどのように変更しましたか?

+0

[Pythonでは、呼び出し元によって認識されるように関数がいくつかの引数を変更できるのはなぜですか?](http://stackoverflow.com/questions/575196/in-python-why-can-a -function-modify-some-arguments-by-the-caller) – CaptainTrunky

答えて

0

私が正しく理解していれば、データセットが変更されることを期待していないときに変更するようになっています。これが問題であるならば、この問題は、この行で発生している:

mData = dataSet # for next loop, append new set 

これを是正するために、私はPythonのコピーとdeepcopyになります。この方法でリストをコピーすると、実際には別のコピーが作成されるのではなく、オリジナルを参照します。たとえば:

x = [1] 
y = x 
x.append(2) 
x  #expected output is [1, 2] because we added 2 to this. 
>>>[1, 2] 
y  #y changes, even though it wasn't directly modified. 
>>>[1, 2] 

この問題を解決する最も簡単な方法は、スプライスコピーを使用することです: のy = xの[:]あなたがリスト内のリストを持っているので しかし、これはあなたの問題を解決することはできません。あなたが必要とするのは、copy moduleのdeepcopyです。私が手伝ったら教えて!

+0

それを打つ!それは私を助ける:-) – SoloistRoy

関連する問題