определение и доступ к списку пользовательских объектов - PullRequest
1 голос
/ 14 декабря 2011

У меня есть объект

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 ]

4 голосов
/ 14 декабря 2011

Наиболее вероятное объяснение состоит в том, что вы на самом деле не звоните createPriceList() до вызова showPriceList(). [ edit : теперь, когда вы отредактировали код в своем вопросемы можем исключить эту возможность]

Кроме того, createPriceList() имеет ошибку, из-за которой вы присваиваете ссылки на один и тот же объект Car для всех элементов списка.Эта ошибка также может объяснить поведение, если и только если последний вызов random() function_giving_a_value() возвращает ноль.

Наконец, вы пропускаете self. в нескольких местах[ edit : опять же, вы, кажется, исправили некоторые из них в недавнем редактировании].

Вот как я бы написал:

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 голосов
/ 14 декабря 2011

В зависимости от того, что вы пытаетесь достичь, может быть лучше сохранить отдельные атрибуты для отдельных 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]

Прайс-лист не должен существовать в классе, так как, на мой взгляд, он избыточен.

0 голосов
/ 14 декабря 2011

Прежде всего, вы используете цикл for «неправильно».Вы создаете индекс по длине списка, а затем получаете доступ к элементам из этого же списка, используя этот индекс.Это можно упростить, например, метод createPriceList, который может выглядеть следующим образом:

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

То, что вы сделали в своем примере, это создание одной машины перед циклом и изменение ее значения при каждом сохранениимашина.Это означает, что ваш список будет заполнен ссылками на одну и ту же машину, поэтому все они будут иметь одинаковую цену.

Нули, потому что random () возвращает число с плавающей запятой между 0 и 1. Если это числоменьше 0.1, печатная версия будет выглядеть как 0.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...