2017-05-18 121 views
-1

我想遍歷一個嵌套for循環的2d數組,當我繪製它時有不同的值,但是當我嘗試訪問數據時,它的元素都是相同。我已經嘗試了不同風格的循環,但得到相同的錯誤。這更多的是我不明白來自Java的錯誤。如何在Python中嵌套循環2.7

predicted_values = 2*[2*[0]] # number of lines *[ number of data points *[0]] 

for row in predicted_values: 

    #last given price 
    row[0] = adj_close[len(adj_close)-1] 

    for index in xrange(1,len(row)): 

     random_float_0_1 = random.random() 
     drift = meanPDR -variance/2 
     random_offset = standard_deviation*norm.ppf(random_float_0_1) 
     t = drift + random_offset 
     predicted_stock_price = row[index-1]*math.exp(t) 
     row[index] = predicted_stock_price 
     print predicted_values 

    plt.plot(range(0,len(row)),row) 

時,我希望它輸出

[[152.186905, 149.88609120889242], [152.186905, 0]] 
[[152.186905, 149.88609120889242], [152.186905, 151.0754945683822]] 

發生了什麼事,以覆蓋其不應該訪問到以前的數據它輸出

[[152.186905, 149.88609120889242], [152.186905, 149.88609120889242]] 
[[152.186905, 151.0754945683822], [152.186905, 151.0754945683822]] 

回答

1

問題不在於循環:它是你沒有意識到Python列表的語義短語。這是你的嵌套列表用較短的名稱和一個簡單的變化:

>>> pv = 2*[2*[0]] 
>>> pv 
[[0, 0], [0, 0]] 
>>> pv[0][1] = "new" 
>>> pv 
[[0, 'new'], [0, 'new']] 

的問題是,你沒有做四個獨立的元素:您的兩個引用到相同 2元列表。

這裏是矯枉過正版本:

>>> pv = [[0 for col in range(2)] for row in range(2)] 
>>> pv 
[[0, 0], [0, 0]] 
>>> pv[0][1] = "new" 
>>> pv 
[[0, 'new'], [0, 0]] 
>>> pv[1][0] = "abc" 
>>> pv 
[[0, 'new'], ['abc', 0]] 

這是否讓你感動?

請記住,Python中的變量是全部 indirect:對值的引用。

+0

這是我應該如何初始化Python中的任何2D數組?我來自java,所以這看起來很奇怪。 – KenBone

+0

沒有;請參閱「重複」關閉此問題中引用的問題下的答案。當'ImportanceOfBeingErnest'擊敗我時,我正在尋找它。 – Prune