zoukankan      html  css  js  c++  java
  • python 嵌套字典、列表 赋值 出现相同值 问题

    错误代码:

    import copy
    lists={}
    test=['s1','s2','s3']
    data = {'value': '',}
    for i in range(2):
        lists[i] = data
    
    for j in range(2):
        lists[j]['value']=test[j]
    
    print(lists)

    结果:

    Connected to pydev debugger (build 182.5107.22)
    {0: {'value': 's2'}, 1: {'value': 's2'}}

    改正后代码

    import copy
    lists={}
    test=['s1','s2','s3']
    data = {'value': '',}
    for i in range(2):
        lists[i] = copy.deepcopy(data)
    
    for j in range(2):
        lists[j]['value']=test[j]
    
    print(lists)

    结果:

    Connected to pydev debugger (build 182.5107.22)
    {0: {'value': 's1'}, 1: {'value': 's2'}}

    原因:

    lists[i] = data 在执行 赋值时, 每一次调用的都是 data变量的源地址,并没有改变地址。
    所以我们在下面动态的改变值的时候,就会出现改变一个值,所有结果全部改变。
    类似于python的浅拷贝和深拷贝。 所以只需要将其变为深拷贝即可。copy.deepcopy().

    补充:

    # 这个是嵌套列表 也会出现相同问题 
    import
    copy lists=[] test=['s1','s2','s3'] data = [1] for i in range(2): lists.append(data) lists[0].append('1') print(lists)

    结果:

    [[1, '1'], [1, '1']]

    改正:

    import copy
    lists=[]
    test=['s1','s2','s3']
    data = [1]
    for i in range(2):
        lists.append(copy.deepcopy(data))
    
    lists[0].append('1')
    print(lists)

    结果:

    [[1, '1'], [1]]

    原因同上

    邮箱: 1090055252@qq.com
  • 相关阅读:
    POJ 3273 :Monthly Expense【二分+贪心】
    POJ 3104 Drying【二分】
    Codeforces Round #402 (Div. 2)
    PAT 天梯赛真题集
    PAT 乙级 (将剩下的做了)
    CCPC 2016-2017, Finals (慢慢做,慢慢更新)
    Spring注解开发
    SpringMVC+SSM框架
    Spring5 Framework(IOC+AOP+整合Mybatis事务)
    IDEA 使用小技巧
  • 原文地址:https://www.cnblogs.com/zhaoxianxin/p/13262324.html
Copyright © 2011-2022 走看看