【问题标题】:Why the value of the first appended dictionary is changed when a second one is appended?为什么附加第二个字典时第一个附加字典的值会发生变化?
【发布时间】:2022-01-24 12:49:03
【问题描述】:

在下面的孤立代码 sn-p 中,我试图得到这个结果: lista_skafwn_to_insert: [{'SERVICE REPORTS': ['1']}, {'SERVICE REPORTS': ['2']}],

但我得到了这个:lista_skafwn_to_insert: [{'SERVICE REPORTS': ['2']}, {'SERVICE REPORTS': ['2']}]

为什么第一个字典的值改变了,等于最后一个字典的值?

sr_ged 为 1 的那一刻,我将其附加到列表中。然后 sxima_skafous 字典将此列表用作“SERVICE REPORTS”键中的值。

然后我将此字典附加到 lista_skafwn_to_insert 列表中。

所以 lista_skafwn_to_insert 的第一个元素是这个 {'SERVICE REPORTS': ['1']}

然后我清除 lista_service_reports 并在 sr_ged 上分配一个新值,然后重复上述过程。

为什么在 sr_gedlista_sesrvice_reports 发生任何更改之前附加第一个字典的值会受到影响?

代码sn-p:

lista_skafwn_to_insert = []
lista_service_reports = []

sr_ged = input("sr_ged: ")

lista_service_reports.append(sr_ged)

sxima_skafous = {"SERVICE REPORTS": lista_service_reports}

lista_skafwn_to_insert.append(sxima_skafous)

print('lista_skafwn_to_insert:' + str(lista_skafwn_to_insert))

lista_service_reports.clear()

sr_ged = input("sr_ged: ")

lista_service_reports.append(sr_ged)

sxima_skafous = {"SERVICE REPORTS": lista_service_reports}

lista_skafwn_to_insert.append(sxima_skafous)

print('lista_skafwn_to_insert: ' + str(lista_skafwn_to_insert))

【问题讨论】:

  • 您绝对应该为 Python 寻找可变性。列表在 python 中是可变的,所以如果,例如:a =[1,2,3]; b = a; b.append(4); print(a) >> a = [1,2,3,4] 这应该和你在这里得到的一样。字典也是如此。

标签: python list dictionary


【解决方案1】:

尝试像这样使用 .copy()。列表是一个指针,所以...这就是重点!

    lista_skafwn_to_insert = []
    lista_service_reports = []
    
    sr_ged = input("sr_ged: ")
    
    lista_service_reports.append(sr_ged)
    
    sxima_skafous = {"SERVICE REPORTS": lista_service_reports.copy()}
    
    lista_skafwn_to_insert.append(sxima_skafous)
    
    print('lista_skafwn_to_insert:' + str(lista_skafwn_to_insert))
    
    lista_service_reports.clear()
    
    sr_ged = input("sr_ged: ")
    
    lista_service_reports.append(sr_ged)
    
    sxima_skafous = {"SERVICE REPORTS": lista_service_reports.copy()}
    
    lista_skafwn_to_insert.append(sxima_skafous)
    
    print('lista_skafwn_to_insert: ' + str(lista_skafwn_to_insert))

【讨论】:

    【解决方案2】:

    两个词典都引用了同一个列表。 clear 方法只改变原始列表。它不会创建一个新的。将clear 调用更改为:

    lista_service_reports = []
    

    这将启动一个全新的列表以存储在第二个字典中。

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2018-01-16
      • 1970-01-01
      • 2016-03-24
      • 2021-03-10
      • 2017-10-21
      相关资源
      最近更新 更多