def to_un(g):
un = []
for v in g:
un.append(v)
print(g)
for v in range(len(un)):
for u in un[v]:
if v not in un[u]:
un[u].append(v)
print(g)
print(g == un)
print(g is un)
def main():
a = [[1], []]
to_un(a)
if __name__ == "__main__":
main()
结果。
[[1], []]
[[1], [0]]
True
False
我以为g的值不会改变,但实际上却发生了变化,我不知道这段代码发生了什么副作用。
un
是一个浅层的 g
所以嵌套的列表是对两个列表的引用。你也需要复制嵌套的列表。
un = [v[:] for v in g]
你可以认为 python 中的 list 是通过引用传递的。在这种情况下, g
是列表,这意味着当你做。
un = []
for v in g:
un.append(v)
你要复制每个列表的引用 v
,至 un
. 这意味着如果你改变了 un
的元素,你将改变 g
. 为了避免这种情况,请将上面的几行替换为。
import copy
un = copy.deepcopy(g)
这是因为在python的list中使用了 "Pass by reference"。你可以通过这样做来达到你需要的结果。un[:] = g取而代之的是un =[]for v in g: un.append(v)