2011-12-14 95 views
1

我有一個對象定義和使用自定義對象的列表

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只給出z性愛? (當它似乎正確填寫方法createPriceList()
+0

我預計所有的價格都是一樣的,但我不希望所有的價格都是零,而是一些隨機價值。 – 2011-12-14 14:40:40

+0

我更喜歡'price = 0.0`而不是`price = float(0)` – juliomalegria 2011-12-14 14:47:47

+0

@ Marnach,事實上,我放了random(),但這是一個錯誤的想法。 function_giving_a_price()爲最後10輛汽車返回0.0。我修改了我原來的問題 – user1097922 2011-12-14 15:34:40

回答

3

最有可能的解釋是,你不實際調用 showPriceList()之前調用 createPriceList() [編輯:現在你已經編輯你的問題的代碼,就可以消除這種可能性]

此外,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() 
0

首先,你在一個「錯誤」的方式使用for循環。您正在從列表長度創建索引,然後使用此索引從同一列表中訪問元素。這可以簡化,舉個例子你createPriceList方法,它可能是這樣的:

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

你在你的榜樣的所作所爲,是在循環之前創建一個車,並改變你每次存儲車時間很值。這意味着您的carlist將充滿參考同一輛車,因此它們都具有相同的價格。

的零點是因爲隨機的()返回0和1之間的浮點數如果這個數字越小則0.1,印刷版本看起來像0.0

0

取決於你正在努力acheive什麼,它也許是更好地保持對單一汽車單屬性()秒,並建立汽車名單()實例之外的類:

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] 

價目表不應該在類中存在,因爲它是多餘的,在我意見。