做《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)