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时使用递归的问题
答案 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]]