【问题标题】:Why this python code occurs the side-effect?为什么这个 python 代码会产生副作用?
【发布时间】:2020-09-09 13:30:00
【问题描述】:
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】:

    这是由于 python 列表中的“通过引用传递”。您可以通过执行以下操作来获得所需的结果: un[:] = g 代替 联合国 = [] 对于 g 中的 v: un.append(v)

    【讨论】:

    • 这是由于 python 列表中的“通过引用传递”。您可以通过这样做来获得所需的结果: un[:] = g 而不是 un = [] for v in g: un.append(v)
    【解决方案2】:

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

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

    您将每个列表 v 的引用复制到 un。这意味着如果您更改un 的元素,您将更改g 的元素。为避免这种情况,请将以上行替换为:

    import copy
    un = copy.deepcopy(g)
    

    【讨论】:

      【解决方案3】:

      ung 的浅拷贝,因此嵌套列表是对两者中相同列表的引用。您还需要复制嵌套列表。

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

      【讨论】:

        猜你喜欢
        • 2018-04-19
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 2016-04-04
        • 2020-07-17
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        相关资源
        最近更新 更多