这两个印刷品的结果完全不同

时间:2017-09-03 04:26:47

标签: python

    n = 10
    s = [True] * (n)
    a = []
    def dfs(m):
        if m == 0:
            print(s) #(1)
            if s not in a:
                print(s) #(2)
                a.append(s)
            return
        for x in range(0, n, 2):
            s[x] = not s[x]
        dfs(m - 1)
        for x in range(0, n, 2):
            s[x] = not s[x]
        for x in range(1, n, 2):
            s[x] = not s[x]
        dfs(m - 1)
        for x in range(1, n, 2):
            s[x] = not s[x]
        for x in range(0, n, 3):
            s[x] = not s[x]
        dfs(m - 1)
        for x in range(0, n, 3):
            s[x] = not s[x]
    dfs(10)

为什么第一个印刷品有多种不同的s,但第二个印刷品只有初始s。我无法理解。我怎么能避免这种情况 当我使用python时使用递归的问题

1 个答案:

答案 0 :(得分:1)

当第一次m等于零时s被附加到第一次时,它不会将列表s的副本附加到a。它附加了对s的引用,因此每次更改时,内容都会随之更改。您的打印#2只进行过一次,if not s in a仅在第一次为真。

在Python控制台中尝试这个,看一个更简单的例子:

>>> a = [1,2,3,4]
>>> b = []
>>> b.append(a)
>>> a[2] = 7
>>> b
[[1, 2, 7, 4]]