首页 > 解决方案 > 附加一个 python 列表会覆盖另一个

问题描述

更新:我简化了示例并添加了预期结果

我犯了一个错误,无法弄清楚。

当我运行它时,我的期望是initial_payload将包含来自的第一组 ['users'] users_to_survey,因为我在覆盖之前附加它们,然后当我覆盖 product_payload['users'] 时,reminder_payload将包含 [ '用户'] 来自users_to_remind.

但是当我在最后打印initial_payload时,它与reminder_payload. 两者的 ['users'] 相同

initial_payload = []
reminder_payload = []

product_payload = {
    'product': 'colgate',
}

users_to_survey = ['kevin', 'dan']

if users_to_survey:
    product_payload['users'] = users_to_survey
    initial_payload.append(product_payload)


users_to_remind = ['bill', 'tom']

if users_to_remind:
    product_payload['users'] = users_to_remind
    reminder_payload.append(product_payload)

print(initial_payload)
print(reminder_payload)

我确定我缺少一些基本的东西。

标签: python

解决方案


真的不确定你想要完成什么,但我可以告诉你为什么你会看到你所看到的。由于您创建了一个名为 product_payload 的字典,如果您当前的产品有要调查的用户和要提醒的用户,那么您将在写出时覆盖对象引用。

创建两个product_payloads,每个用户调查和用户提醒。尝试这个

initial_payload = []
reminder_payload = []

product_payload_survey = {
    'product': 'colgate',
}
product_payload_remind = {
    'product': 'colgate',
}

users_to_survey = ['kevin', 'dan']

if users_to_survey:
    product_payload_survey['users'] = users_to_survey
    initial_payload.append(product_payload_survey)


users_to_remind = ['bill', 'tom']

if users_to_remind:
    product_payload_remind['users'] = users_to_remind
    reminder_payload.append(product_payload_remind)

print(initial_payload)
print(reminder_payload)

尝试运行下面的代码片段以了解我正在谈论的错误。

class product:
    def __init__(self):
        self.get_users_to_survey = [1,2,3]
        self.get_users_to_remind = [4,5]
    BATCH_SIZE = 3
products = [product()]

initial_payload = []
reminder_payload = []

for product in products:

    product_payload = {
        'product': product,
    }

    users_to_survey = product.get_users_to_survey

    if users_to_survey:
        product_payload['users'] = users_to_survey[:BATCH_SIZE]
        product_payload['type'] = 'initial'
        initial_payload.append(product_payload)

    print(initial_payload)

    users_to_remind = product.get_users_to_remind

    if users_to_remind:
        product_payload['users'] = users_to_remind[:BATCH_SIZE]
        product_payload['type'] = 'reminder'
        reminder_payload.append(product_payload)

    print(initial_payload)

推荐阅读