首页 > 解决方案 > 如何修复for循环的输出列表始终将最后一个索引的最后一个值存储在python中

问题描述

我尝试从名为 date_range 的数据列表中存储 weekofyear 的数量,该列表存储了诸如

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所以 在此处输入图像描述 ,如何修复它。

标签: pythonlistloopsfor-loop

解决方案


  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)

推荐阅读