【问题标题】:Appending one python list is overriding another附加一个 python 列表会覆盖另一个
【发布时间】:2020-04-25 09:53:31
【问题描述】:

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

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

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

但是当我在结尾打印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)

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

【问题讨论】:

  • users_to_survey = product.get_users_to_survey 应该是一个电话吧? users_to_remind 也一样?
  • 你能举一个更简单的例子吗?这些变量名称和重新分配很难理解(这可能是问题的原因)。还请添加实际输入,以便重现。
  • @dedObed 如果这是问题所在,他在尝试对其进行切片时会出错。
  • 您在两个 if 块中使用相同的 product_payload 字典。这是故意的吗?
  • 也许你正在覆盖product_payload

标签: python


【解决方案1】:

真的不确定你想要完成什么,但我可以告诉你为什么你会看到你所看到的。由于您创建了一个名为 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)

尝试运行下面的代码 sn-p 以了解我所说的错误。

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)

【讨论】:

  • 您对问题的描述是正确的,但是您的代码有同样的问题。
  • @Barmar:我认为代码是为了让问题更清晰,而不是解决它。
  • 只是简化了例子
  • 解决方案在文本中,但是:“创建两个 product_payload,一个用于每个用户进行调查和用户提醒。”
  • @FredLarson 是的,这是我的意图,感谢您的澄清。 Brenden,你的新代码仍然有同样的问题,你覆盖了 product_payload
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2020-03-27
  • 2020-06-27
  • 2015-07-11
相关资源
最近更新 更多