2016-05-15 3 views
0

Я делаю программу, в которой храню и показываю инвентарь автомобилей через меню. Тем не менее, я продолжаю получать ошибки:UnboundLocalError: локальная переменная 'cars', на которую ссылаются перед назначением

".py", line 24, in car_invent 
    cars = cars.Car(make, model, mileage, price, doors) 
UnboundLocalError: local variable 'cars' referenced before assignment" 

Я уже импортировали модуль в начале, и я не понимаю, почему это дает мне эту ошибку

Мой код

import cars 

def print_desc(item): 
    print "Make:", item.get_make() 
    print "Model:", item.get_model() 
    print "Mileage:", item.get_mileage() 
    print "Price:", item.get_price() 

def car_invent(): 
    car_invent = [] 

    print "Enter data for the cars." 

    num_cars = input("Enter number of cars: ") 

    for count in range(num_cars): 
     make = raw_input("Enter the make: ") 
     model = input("Enter the year model: ") 
     mileage = input("Enter the mileage: ") 
     price = input("Enter the price: ") 
     doors = input("Enter the number of doors: ") 

     cars = cars.Car(make, model, mileage, price, doors) 

     car_invent.append(cars) 

    return car_invent 

def truck_invent(): 
    truck_invent = [] 

    print "Enter data for the trucks." 

    num_trucks = input("Enter number of trucks: ") 

    for count in range(num_trucks): 
     make = raw_input("Enter the make: ") 
     model = input("Enter the year model: ") 
     mileage = input("Enter the mileage: ") 
     price = input("Enter the price: ") 
     drive_type = input("Enter the drive type: ") 

     trucks = cars.Truck(make, model, mileage, price, drive_type) 

     truck_invent.append(truck) 

    return truck_invent 

def suv_invent(): 
    suv_invent = [] 

    print "Enter data for the cars." 

    num_suv = input("Enter number of SUVs: ") 

    for count in range(1, num_suv): 
     make = raw_input("Enter the make: ") 
     model = input("Enter the year model: ") 
     mileage = input("Enter the mileage: ") 
     price = input("Enter the price: ") 
     pass_cap = input("Enter passenger capacity: ") 

     suv = cars.SUV(make, model, mileage, price, pass_cap) 

     suv_invent.append(suv) 

    return suv_invent 


def read_invent(car_invent, truck_invent, suv_invent): 
    print "USED CAR INVENTORY" 
    print "==================" 
    print "The following car is in inventory." 

    for item in car_invent: 
     print_desc(item) 
     print "Number of doors:", item.get_doors() 

    print "The following pickup truck is in inventory." 

    for item in truck_invent: 
     print_desc(item) 
     print "Drive type:", item.get_drive_type() 


    print "The following SUV is in inventory." 

    for item in suv_invent: 
     print_desc(item) 
     print "Passenger Capacity:", item.get_pass_cap() 

def menu(): 
    print "MENU" 
    print "=====" 
    print "1. Enter data for inventory" 
    print "2. Display inventory" 
    print "3. Quit" 

def main(): 
    menu() 

    choice = input("Enter choice: ") 
    while choice != 3: 

     if choice == 1: 
      cars = car_invent() 
      trucks = truck_invent() 
      suv = suv_invent() 
      choice = input("Enter choice: ") 

     elif choice == 2: 
      read_invent(cars, trucks, suv) 
      choice = input("Enter choice: ") 

     else: 
      print "Invalid choice" 
      choice = input("Enter choice: ") 

main() 

Здесь также модуль для справки:

class Automobile: 

    def __init__(self, make, model, mileage, price): 
     self.__make = make 
     self.__model = model 
     self.__mileage = mileage 
     self.__price = price 

    def set_make(self, make): 
     self.__make = make 

    def set_model(self, model): 
     self.__model = model 

    def set_mileage(self, mileage): 
     self.__mileage = mileage 

    def set_price(self, price): 
     self.__price = price 

    def get_make(self): 
     return self.__make 
    def get_model(self): 
     return self.__model 

    def get_mileage(self): 
     return self.__mileage 
    def get_price(self): 
     return self.__price 

class Car(Automobile): 
    def __init__(self, make, model, mileage, price, doors): 
     Automobile.__init__(self, make, model, mileage, price) 

     self.__doors = doors 

    def set_doors(self, doors): 
     self.__doors = doors 

    def get_doors(self): 
     return self.__doors 

class Truck(Automobile): 
    def __init__(self, make, model, mileage, price, drive_type): 
     Automobile.__init__(self, make, model, mileage, price) 

     self.__drive_type = drive_type 

    def set_drive_type(self, drive_type): 
     self.__drive_type = drive_type 

    def get_drive_type(self): 
     return self.__drive_type 

class SUV(Automobile): 
    def __init__(self, make, model, mileage, price, pass_cap): 
     Automobile.__init__(self, make, model, mileage, price) 

     self.__pass_cap = pass_cap 

    def set_pass_cap(self, pass_cap): 
     self.__pass_cap = pass_cap 

    def get_pass_cap(self): 
     return self.__pass_cap 

ответ

1
cars = cars.Car(make, model, mileage, price, doors) 
  1. Вы объявить локальную переменную с именем cars

  2. Вы назначаете cars.Car(...) к cars

  3. Но cars локальная переменная, которая не имеет значения еще (несвязанный местное)

  4. Ваши программные сбои

+0

Хорошо, но w hy это вызывает ошибку внутри функции, но не в области модуля? Я думаю, что это будет иметь какое-то отношение к 'func .__ code __. Co_varnames', затеняющему глобальную область видимости? Не совсем уверен в том, что касается внутренних дел. –

+0

Да, он затенен - ​​более подробное объяснение [приведено здесь] (http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python). Я особенно признал часть 'dis'. –

Смежные вопросы

 Смежные вопросы