所以,我有一段代码,它应该遍历一个产品列表,将它们与价格链接起来,然后将价格作为“显示项”显示在网页上给用户

for product in product_list:
    p = PricedProduct.objects.filter(proid=product)
    p.order_by('date')


    dp = DisplayProduct
    dp.proid = product.id
    dp.proname = product.productname

    print(product.productname)

    dp.proprice = p[0].value
    displaylist.insert(0,dp)

在这里,我将项目链接到“打印”方法当前显示的价格:
苹果
香蕉
但是当我运行时:
for dp in displaylist:
    print(dp.proname)

它显示:
香蕉
香蕉
有人能告诉我为什么会这样吗,因为它导致我的网页只显示2个香蕉而不是一个苹果和一个香蕉

最佳答案

不初始化DisplayProduct,只需将dp设置为对DisplayProduct类的引用,然后直接更改该类的字段:

for product in product_list:
    p = PricedProduct.objects.filter(proid=product)
    p.order_by('date')


    dp = DisplayProduct()  # construct a new DisplayProduct
    dp.proid = product.id
    dp.proname = product.productname

    print(product.productname)

    dp.proprice = p[0].value
    displaylist.insert(0,dp)

请注意,此代码相当低效:通过在顶部插入,构造具有时间复杂度O(N2)的算法。在列表末尾追加通常更有效(因为它已经分摊了O(1)的成本)。如果你需要颠倒列表,最好在最后颠倒。
我还建议为DisplayProduct构造一个合适的初始化器(也许您的类已经有了一个合适的初始化器),以便我们可以将其重写为:
for product in product_list:
    p = PricedProduct.objects.filter(proid=product)
    p.order_by('date')

    # might require some changes to the __init__ of DisplayProduct
    dp = DisplayProduct(
        proid=product.id,
        proname=product.productname,
        proprice=p[0].value
    )

    print(product.productname)

    # appending is more efficient than prepending
    displaylist.append(dp)

关于python - list 填写不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50542610/

10-13 00:40