我有一个对象
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()
)答案 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不应该存在于类中,因为它是多余的。