递归函数变量混淆

2024-09-29 21:34:44 发布

您现在位置:Python中文网/ 问答频道 /正文

megaList = []
clmsArrow = [[3],[2,3,4],[1,3,5],[3],[3],[3],[3]]

def columnState(y,amnt):
    "-1 for all values in a list of lists"
    megaList.append(y)
    print(y)
    for i in range(len(y)):
        for j in range(len(y[i])):
            y[i][j] -= 1
            if y[i][j] == 0:
                y[i][j] = 5

    if amnt != 1:
        return columnState(y,amnt-1)

columnState(clmsArrow,5)
print('\n')
for x in megaList:
    print(x)

''Output''

[[3], [2, 3, 4], [1, 3, 5], [3], [3], [3], [3]]
[[2], [1, 2, 3], [5, 2, 4], [2], [2], [2], [2]]
[[1], [5, 1, 2], [4, 1, 3], [1], [1], [1], [1]]
[[5], [4, 5, 1], [3, 5, 2], [5], [5], [5], [5]]
[[4], [3, 4, 5], [2, 4, 1], [4], [4], [4], [4]]


[[3], [2, 3, 4], [1, 3, 5], [3], [3], [3], [3]]
[[3], [2, 3, 4], [1, 3, 5], [3], [3], [3], [3]]
[[3], [2, 3, 4], [1, 3, 5], [3], [3], [3], [3]]
[[3], [2, 3, 4], [1, 3, 5], [3], [3], [3], [3]]
[[3], [2, 3, 4], [1, 3, 5], [3], [3], [3], [3]]

为什么我不能正确地写出全局变量(list)?我只得到相同的第一个函数输入乘以5

正如在函数内部的输出中看到的,一切正常,但是当我尝试将相同的变量添加到函数外部的列表时,出现了一些错误


Tags: 函数inforlenifdefrangeall
1条回答
网友
1楼 · 发布于 2024-09-29 21:34:44

这是因为您不断地将引用添加到y中的mega_list。如果你改变y,你也会改变所有对y的引用。例如:

a = [1, 2]
b = [a, a]
print(b)
a[0] = 99
print(b)

哪个指纹

[[1, 2], [1, 2]]
[[99, 2], [99, 2]]

注意b是如何改变的,尽管我只改变了a。这是因为b包含a的引用,而不是副本。你知道吗

要在代码中修复此问题,只需将其添加到函数的开头

y = deepcopy(y)

您还需要添加

from copy import deepcopy

你之所以需要deepcopy而不是简单地做y[:],是因为你的y是嵌套列表,即它里面的所有列表也只是对其他列表的引用,这些列表也需要复制。你知道吗

最后,返回到原始值的原因是,您使amnt等于5,如果您运行if5次函数,则函数不会执行任何操作,因为

        if y[i][j] == 0:
            y[i][j] = 5

所以他们正在改变,他们只是回到他们开始的地方。如果你跑了

columnState(clmsArrow, 4)

例如,您将看到更改,即

[[3], [2, 3, 4], [1, 3, 5], [3], [3], [3], [3]]
[[2], [1, 2, 3], [5, 2, 4], [2], [2], [2], [2]]
[[1], [5, 1, 2], [4, 1, 3], [1], [1], [1], [1]]
[[5], [4, 5, 1], [3, 5, 2], [5], [5], [5], [5]]

[[4], [3, 4, 5], [2, 4, 1], [4], [4], [4], [4]]
[[4], [3, 4, 5], [2, 4, 1], [4], [4], [4], [4]]
[[4], [3, 4, 5], [2, 4, 1], [4], [4], [4], [4]]
[[4], [3, 4, 5], [2, 4, 1], [4], [4], [4], [4]]

相关问题 更多 >

    热门问题