定义和访问自定义对象列表

时间:2011-12-14 14:37:45

标签: python list object

我有一个对象

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.carList被正确识别(len在循环中给出正确的数字),但self.carList[i].price只给出零? (当它似乎正确填写方法createPriceList()

3 个答案:

答案 0 :(得分:4)

最可能的解释是,在致电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()

答案 1 :(得分:0)

首先,你以'错误'的方式使用for循环。您正在从列表的长度创建索引,然后使用此索引访问同一列表中的元素。这可以简化,例如你的createPriceList方法,它可能如下所示:

def createPriceList(self):
    for car in self.carList
        car.price = random()
        print car.price

您在示例中所做的是在循环之前创建一辆汽车,并在每次存放汽车时更改它的值。这意味着您的汽车清单将充满对同一辆汽车的参考,因此它们都具有相同的价格。

零是因为random()返回0到1之间的浮点数。如果此数字小于0.1,则打印版本将显示为0.0

答案 2 :(得分:0)

根据您尝试实现的目标,最好保留单个Car()的单个属性,并在类之外构建一个Car()实例列表:

import random

class Car:
    def __init__(self):
        self.price = random.random()

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

day = Day()
priceList = [car.price for car in day.cars]

在我看来,priceList不应该存在于类中,因为它是多余的。