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