2016-05-15 79 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'部分特别富有洞察力。 –

相关问题