首页 > 解决方案 > 嵌套'for'循环覆盖数据

问题描述

COMMON_CASES = {'OSX Catalina - Latest Chrome': {'acceptSslCerts': 'true',
                                  'browser': 'Chrome',
                                  'browser_version': '81.0 beta',
                                  'browserstack.debug': 'true',
                                  'browserstack.local': 'true',
                                  'browserstack.networkLogs': 'true',
                                  'os': 'OS X',
                                  'os_version': 'Catalina',
                                  'resolution': '1280x1024'},
 'OSX Catalina - Latest Edge': {'acceptSslCerts': 'true',
                                'browser': 'Edge',
                                'browser_version': '81.0 beta',
                                'browserstack.debug': 'true',
                                'browserstack.local': 'true',
                                'browserstack.networkLogs': 'true',
                                'os': 'OS X',
                                'os_version': 'Catalina',
                                'resolution': '1280x1024'},
 'OSX Catalina Latest Safari': {'acceptSslCerts': 'true',
                                'browser': 'Safari',
                                'browser_version': '13',
                                'browserstack.debug': 'true',
                                'browserstack.local': 'true',
                                'browserstack.networkLogs': 'true',
                                'os': 'OS X',
                                'os_version': 'Catalina',
                                'resolution': '1280x1024'}}

LOGIN_SUCCESS = {'Login Success Customer': ('vedran@fishing.vedran', 'vedran123'), 'Login Success Captain': ('vedran@fishing.vedran', 'vedran123'), 'Login Success Admin': ('vedran@fishing.vedran', 'vedran123')}

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()):
        # case_s = f'{case_name} / {test_name}'
        device_data['name'] = test_name
        caps.append(test_data + (device_data,))

print(caps) 

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

现在,当我运行它时,我希望该列表将包含每个登录案例中的 3 个,登录成功客户、登录成功队长和登录成功管理员 但是,如果您运行我提供的代码,您将看到“名称' 在字典中始终是Login Success Admin。那个怎么样?当我在函数内打印代码时,一切都是正确的,但是当我附加到列表时,它会以某种方式发生变化。嵌套循环在 Python 中的工作方式是否不同?

标签: pythonpython-3.xloopsnested-loops

解决方案


复制您需要的数据并使用它

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 不会隐式复制字典。它们指向相同的内存位置。


推荐阅读