重命名 Python 中的列表索引 - 寻求代码解释

Renaming list indices in Python - seeking explanation of code

我正在学习Python,这是我第一次真正体验编程。我一直在研究 here.

中的一系列课程

我上的课与嵌套循环有关。然而,在一个练习中,他们通过重命名列表项的索引来提供解决问题的方法。请记住,这不是正在使用的字典。虽然这些课程进展顺利,但这个问题的答案让我感到困惑,因为没有解释发生了什么。此外,我似乎无法在课程系列的其他任何地方或其他地方找到对这种技术的参考。

这是练习要我做的事情。 1“编写一个程序,它使用嵌套的 for 循环来填充表示日历的三维列表:顶级列表应包含每个月的子列表,每个月应包含四个星期。每个星期应该是一个空列表。 2 修改您的代码,以便更容易通过人类可读的月份名称访问日历中的月份,并通过从 1 开始编号的名称访问每周。将事件(以字符串描述的形式)添加到七月的第二周。

第一部分没问题。第二部分给了参数有点挑战,但给出的答案不是我期望的。

我看过关于使用字典实现这种命名索引目标的堆栈溢出的解释: Python: can I have a list with named indices?

但是,这里提供了解决方案:

(JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER) = range(12)

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4)

calendar = []
for m in range(12):
    month = []

    for w in range(4):
        month.append([])

    calendar.append(month)
calendar[JULY][WEEK_2].append("Go on holiday!")
print(calendar)

有人可以解释一下这是如何工作的吗?我觉得奇怪的是,月份和星期名称不必是字符串,而只是变量名称。我认为每个变量名都被分配给定义的特定范围内的每个项目。但是,我很惊讶变量名可以用作列表索引。一旦完成,我就不能再通过数值引用索引了。例如,我不能使用:

calendar[1][1].append("This is the first week of January.")

我对此更加困惑,因为当我在最后一行之后写一个简单的循环时:

for i in range(12):
    print(i)

我像往常一样打印出数字 0 到 11,但不是这些变量名。

到底发生了什么,它是如何工作的?

像这样声明变量列表:

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4)

是一种将多个值存储到多个变量的方法。和这样做是一样的:

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = (0,1,2,3)

或者这个:

WEEK_1 = 0
WEEK_2 = 1
WEEK_3 = 2
WEEK_4 = 3

range(4) returns 从 0 到 3 的整数列表。

range(4) == (0,1,2,3)

在python中,可以写一个变量列表作为左操作数,并通过在右操作数上写一个数据列表来给它们赋值。在这种情况下,左侧列表的第一个变量将存储右侧第一个数据的值,左侧第二个变量将存储右侧第二个数据的值,依此类推。

在您的练习中,月份和星期仅作为整数存储在内存中。 这些整数都存储在变量中,变量的名称代表每个值所描述的内容。

与您所说的相反,calendar[1][1].append("First week of January") 确实有效。从技术上讲,一月的第一周是在 calendar[0][0] 中,因为列表的索引从 0 开始。这样做的原因是因为如前所述,WEEK_1, WEEK_2 等是存储整数的变量名。因此,月份也会发生同样的事情。当你说 calendar[JULY][WEEK_2] 时,它与说 calendar[7][1] 完全一样,只是现在你将这些数字存储到更易读的变量中,因此代码更能代表它所做的事情并且更容易阅读。

好的,我现在明白了。我的困惑是,在我看来,我正在分配名为变量​​的索引。我现在明白我只是给数字起个名字, 而不是 索引。 indecis 总是整数。

我现在看到这个是因为我可以使用以下任一方法引用上述代码在 1 月份的第二周:

calendar[0][1].append("Week 2 of January")
calendar[JANUARY][WEEK_2].append("Week 2 of January")
calendar[JANUARY][FEBRUARY].append("Week 2 of January")
calendar[WEEK_1][WEEK_2].append("Week 2 of January")

所有这些都指向索引 [1] 和 [0]。我没有以某种方式神奇地影响我调用的 range(12) 函数。

(一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月)=范围(12)

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = 范围(4)

calendar = []
for m in range(12):
month = []

for w in range(4):
    month.append([])

calendar.append(month)
calendar[JULY][WEEK_2].append("Go on holiday!")
print(calendar)

这个程序不是 运行。