2017-05-18 80 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