我有一个对象

class Car:
  def __init__(self):
    price = float(0)


然后另一个

class Day:
  def __init__(self):
    self.carList = [Car() for each in range(100)]
    self.createPriceList()

  def createPriceList(self):
    tempCar = Car()
    for i in range(100):
      tempCar.price = function_giving_a_value() # 10 last cars have 0.0 as value
      self.carList[i] = tempCar
      print i, self.carList[i].price
# prints the correct list : each line contains a correct price
#edited after answers : in fact it's just misleading, cf answers

  def showPriceList(self):
    for i in range(len(self.carList)):
      print i, self.carList[i].price
# prints i (correct) but each self.carList[i].price as 0.0
# so len(self.carList) gives correct value,
# but self.carList[i].price a wrong result


我的问题是:


为什么在showPriceList()中可以正确识别self.carListlen在循环中给出正确的数字)而self.carList[i].price仅给出零? (当在方法createPriceList()中似乎正确填充时)

最佳答案

最可能的解释是您实际上没有在调用createPriceList()之前先调用showPriceList()。 [编辑:既然您已经编辑了问题中的代码,我们就可以消除这种可能性]

另外,createPriceList()会出现错误,您将对同一Car对象的引用分配给列表的所有元素。当且仅当最后一个random() function_giving_a_value()调用返回零时,此错误才能解释此行为。

最后,您在几个地方都缺少了self. [编辑:再次,您似乎在最近的编辑中已经修复了其中的一些]。

这是我的写法:

import random

class Car:

    def __init__(self, price):
        self.price = price

class Day:

  def __init__(self, n):
      self.carList = []
      for i in range(n): # could also use list comprehension here
          self.carList.append(Car(random.random()))

  def printPriceList(self):
      for i, car in enumerate(self.carList):
        print(i, car.price)

day = Day(20)
day.printPriceList()

10-07 16:46