嵌套的“ for”循环覆盖数据

时间:2020-04-07 09:38:09

标签: python python-3.x loops nested-loops

SelectedValue="{Binding Path=KlasseProp.KlassenIDFK, UpdateSourceTrigger=PropertyChanged}"

我需要使用两个for循环合并两个变量,因为我需要使用两个数组中的键为测试用例建立一个名称。我的两个字典中都有3个项目,因此我需要在最终列表中有9个项目,这应该是一个元组列表。

现在,当我运行此命令时,我希望该列表将包含每个登录案例中的3个,登录成功客户,登录成功负责人和登录成功管理员 但是,如果运行我提供的代码,您会发现字典中的“名称”始终为登录成功管理员。那个怎么样?当我在函数内打印代码时,一切都正确,但是当我追加到列表后,它会有所改变。嵌套循环在Python中的工作方式是否有所不同?

2 个答案:

答案 0 :(得分:2)

制作所需数据的副本并代替使用

caps = []
for case_index, (test_name, test_data) in enumerate(LOGIN_SUCCESS.items()):
    for test_index, (case_name, device_data) in enumerate(COMMON_CASES.items()):
        data = device_data.copy()
        data['name'] = test_name
        caps.append(test_data + (data,))

正如jonrsharpe在他的评论中提到的,您引用的是同一本词典。将字典分配给新变量时,Python不会隐式创建字典的副本。它们指向相同的内存位置。

答案 1 :(得分:2)

Python中的词典通过引用传递,因此代码中的这一行:

device_data['name'] = test_name

更改原始COMMON_CASES变量中的词典,因此在循环结束时,“名称”字段的值将设置为上一次“案例”迭代(“登录成功管理员”)中的“名称”值。

您可以复制字典:

caps = []
for case_index, (test_name, test_data) in enumerate(LOGIN_SUCCESS.items()):
    for test_index, (case_name, device_data) in enumerate(COMMON_CASES.items()):
        device_data2 = device_data.copy()
        device_data2['name'] = test_name
        caps.append(test_data + (device_data2,))