为什么这个python代码会出现副作用?

问题描述 投票:0回答:1
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的值不会改变,但实际上却发生了变化,我不知道这段代码发生了什么副作用。

python list side-effects
1个回答
1
投票

un 是一个浅层的 g所以嵌套的列表是对两个列表的引用。你也需要复制嵌套的列表。

un = [v[:] for v in g]

0
投票

你可以认为 python 中的 list 是通过引用传递的。在这种情况下, g 是列表,这意味着当你做。

un = []
for v in g:
    un.append(v)

你要复制每个列表的引用 v,至 un. 这意味着如果你改变了 un的元素,你将改变 g. 为了避免这种情况,请将上面的几行替换为。

import copy
un = copy.deepcopy(g)

0
投票

这是因为在python的list中使用了 "Pass by reference"。你可以通过这样做来达到你需要的结果。un[:] = g取而代之的是un =[]for v in g: un.append(v)

© www.soinside.com 2019 - 2024. All rights reserved.