【问题标题】:Nested 'for' loop overwriting data [closed]嵌套'for'循环覆盖数据[关闭]
【发布时间】:2020-04-07 09:38:09
【问题描述】:
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 个,登录成功客户、登录成功队长和登录成功管理员 但是,如果您运行我提供的代码,您会看到 dict 中的“名称”始终是 Login Success Admin。那个怎么样?当我在函数内打印代码时,一切都是正确的,但是当我附加到列表时,它会以某种方式发生变化。嵌套循环在 Python 中的工作方式是否不同?

【问题讨论】:

  • 请在问题中输入minimal reproducible example
  • 现在可以看到了。
  • 这并不是最小的,但是:您的caps 列表包含对同一个字典的多个引用。您从不复制来自COMMON_CASES 的字典。

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


【解决方案1】:

Python 中的字典是通过引用传递的,所以代码中的这一行:

device_data['name'] = test_name

更改原始 COMMON_CASES 变量中的字典,因此当循环结束时,“name”字段的值将设置为上一次“case”迭代(“Login Success Admin”)的“name”值。

您可以复制字典:

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,))

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多