2017-05-27 75 views
0

我正在使用for循環來更新Numpy數組,但它似乎沒有工作。我究竟做錯了什麼?Python - 循環問題

我的代碼

import pandas as pd 
import pandas_datareader as pdr 
import datetime as dt 
from dateutil.relativedelta import relativedelta 
import matplotlib.finance as mf 
import numpy as np 
import scipy as sp 

def pull_price(ticker): 

    df = pd.read_csv(ticker+'.csv') 
    df1=np.array(df['Adj Close']) 
    return df1 




tickers=['^DJI','^GSPC','^IXIC','^GDAXI','^HSI','^FCHI','^N225'] 

dic={} 

for i in tickers: 
    dic[i]=pull_price(i) 


for i in tickers: 
    count = len(dic[i]) 
    for j in range(0,count): 
     try: 
      dic[i][j] = float(dic[i][j]) 
     except ValueError: 
      dic[i][j] = float(dic[i][j-1]) 

dic_1= dic 
print(dic['^GSPC'][0]) 

for i in tickers: 
    count = len(dic_1[i]) 
    for j in range(0,count): 
     dic_1[i][j] = np.log(dic_1[i][j]) 

print(dic_1['^GSPC'][0]) 
print(dic['^GSPC'][0]) 

我對3打印命令的輸出順序

411.410004 
6.01959029389 
6.01959029389 

爲第1 Print命令它顯示我正確的值。 但是對於接下來的2 Print命令爲什麼顯示相同的值。我只更新dic_1而不是dic。我究竟做錯了什麼?

+3

它們是具有不同名稱的相同對象。如果您正在更新dic_1,那麼您也正在更新dic。相反,你需要創建一個副本。如果他們持有不可變的對象,'dic_1 = dic.copy()'應該可以工作。 – ayhan

+0

試過,但給了我同樣的結果 –

回答

1

當你這樣做:

dict1 = dict(a=1) 
dict2 = dict1 

兩個dict1和dict2指向相同的字典。名稱不同,但兩個名稱均指相同的數據結構。這意味着:

dict2['a'] = 2 
print(dict1) 
{'a': 2} 

如果你想dict2是dict1的副本,明確使它成爲一個副本:

dict2 = dict1.copy() 

啊,因爲你的字典中的元素本身也是字典,你需要進行深度複製:

import deepcopy 
dict2 = deepcopy.copy(dict1) 
+0

所以在我的代碼,而不是 之前 我用「DIC_1 = DIC」 「DIC_1 = dic.copy()」 但讓我編輯我的回答同樣的結果 –

+0

,還要感謝@ayhan。 –