簡體   English   中英

如何修復for循環的輸出列表總是在python中存儲最后一個索引的最后一個值

[英]How to fix the list of output from for-loop always store the last value of last index in python

我嘗試從存儲數據的名為 date_range 的數據列表中存儲周數,例如

date_range[1] = DatetimeIndex(['2020-03-02', '2020-03-03', '2020-03-04', '2020-03-05', '2020-03-06', '2020-03-07', '2020-03-08', '2020-03-09', '2020-03-10', '2020-03-11', '2020-03-12', '2020-03-13', '2020-03-14', '2020-03-15', '2020-03-16', '2020-03-17', '2020-03-18', '2020-03-19', '2020-03-20', '2020-03-21', '2020-03-22', '2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26', '2020-03-27', '2020-03-28', '2020-03-29', '2020-03-30', '2020-03-31', '2020-04-01', '2020-04-02', '2020-04-03', '2020-04-04', '2020-04-05'], dtype='datetime64[ns]', freq='D')

通過使用以下代碼

weeknumber = [[0]*35]*2
for i in range(28):
    for j in range(35)):
        weeknumber[i][j]= pd.Timestamp(date_range[i][j]).weekofyear

然而,所有 28 行的結果存儲pd.Timestamp(date_range[28]).weekofyear這樣的最后一個結果在此處輸入圖片說明 那么,如何修復它。

  1. 0是一個int對象(在 Python 中,一切都是對象,記住)。 我們稱這個int對象為“ZERO_OBJECT”。
  2. [0]是具有一個元素的列表對象,該元素是對“ZERO_OBJECT”的引用。 讓我們稱這個列表對象為“LIST_1”
  3. [0]*35創建另一個列表對象,包含對同一個“ZERO_OBJECT”的35引用。 (這就是*運算符在 Python 中的工作方式)。 讓我們稱這個新的列表對象為“LIST_2”
  4. [[0]*35]是另一個具有一個元素的列表對象,該元素是對上述對象“LIST_2”的引用。 讓我們稱這個新的列表對象為“LIST_3”
  5. [[0]*35]*28創建另一個列表對象,由28元素組成,但是這28元素中的每一個都是對同一對象“LIST_3”的引用。 正如我上面所說,這就是*運算符的工作方式。 (並且您認為這28元素是對“LIST_3”獨立副本的引用)。 這絕對不是你想要的 因為,當您更新對“LIST_3”的一個引用時,您會看到它通過對“LIST_3”的所有其他引用反映出來。

要解決此問題,請使用以下代碼:

weeknumber = []
for i in range(28):
    weeknumber.append([])
    for j in range(35)):
        weeknumber[i].append(pd.Timestamp(date_range[i][j]).weekofyear)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM