UnboundLocalError

做《Python编程:从入门到实践》一书中的练习时,运行一段代码,遇到了变量引用的错误:

UnboundLocalError: local variable ‘range’ referenced before assignment

代码

依赖模块car.py

"""一个可用于表示汽车的类"""
#父类
class Car():
    """一次模拟汽车的简单尝试"""
    ...

#提取出的单独类,并将其实例作为子类的一个属性值
class Battery():
    """一次模拟电动汽车电瓶的简单尝试"""
    def __init__(self, battery_size=60):
        """初始化电瓶的属性"""
        self.battery_size = battery_size
        
    def describe_battery(self):
        """打印一条描述电瓶容量的消息"""
        print("This car has a " + str(self.battery_size) + "-kWh battery.")
        
    def get_range(self):
        """打印一条描述电瓶续航里程的消息"""
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
            range = 270
        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)

#子类        
class ElectricCar(Car):
    """模拟电动汽车的独特之处"""
    def __init__(self, make, model, year):
        """
        初始化父类的属性,再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)
        #将Battery类的实例作为属性值
        self.battery = Battery()

执行my_electric_car.py中的代码

from car import ElectricCar

#实例化电动汽车
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()

#调用方法get_range()
my_tesla.battery.get_range()

运行结果

前面运行正常,就是get_range()方法调用出错

2016 Tesla Model S
This car has a 60-kWh battery.
UnboundLocalError: local variable 'range' referenced before assignment

错误意思:在定义前就调用;即是range的作用域出了问题;
观察Battery类可以发现变量battery_size的默认值给的是60;而对于get_range()方法中的if判断条件,battery_size的值不满足任何条件;因而变量range并没有得到实例化(即没有被声明),后面的message调用它就会出错。

解决办法

在方法内,if条件外声明变量range。例如:

    def get_range(self):
    """打印一条描述电瓶续航里程的消息"""

    #解决办法:在if条件外声明变量range
    range = 220

    # 当两个if条件都没有满足时,后面调用range会报错;因为它没有被声明
    if self.battery_size == 70:
        range = 240
    elif self.battery_size == 85:
        range = 270

    message = "This car can go approximately " + str(range)
    message += " miles on a full charge."
    print(message)
-------------完-------------