zoukankan      html  css  js  c++  java
  • 变量引用的错误:UnboundLocalError: local variable 'range' referenced before assignment

    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)

     进行代码运行时,会提示“UnboundLocalError: local variable 'range' referenced before assignment”错误。

    意思是局部变量错误:局部变量‘range’在引用前赋值。

    我们看到在class Battery()这个类下,battery_size的属性被赋值为60

    然后在get_range()函数中,做了一个条件判断,如果battery_size等于70或者85 后将range赋值。并打印出对应信息。

    可事实是,battery_size已经被提前赋值,不会改变,所以条件判断不成立,从而引发错误。

    可以将代码改的灵活一点:

    使用input交互,让选择指定的数,然后将选择的battery size后,对range赋值不同的值。

    class Battery():
        """一次模拟电瓶汽车的简单尝试"""
        def __init__(self,battery_size = 60):
            """初始化电瓶的属性"""
    
            battery_size = int(input("Please input battery size,60&70&85?:"))
            self.battery_size = battery_size
        def get_range(self):
            """打印一条描述电瓶续航的消息"""
    
            if self.battery_size == 60:
                range = 240
            elif self.battery_size == 70:
                range = 270
            else:
                range = 350

    但是这样的代码还是存在问题,比如我输入指定3个数以外还是会报错。

    其实一开始的第一个想法是将range添加到作用域中:

    class Battery():
        """一次模拟电瓶汽车的简单尝试"""
        def __init__(self,battery_size = 60,range = 200):
            """初始化电瓶的属性"""
    
            #battery_size = int(input("Please input battery size,60&70&85?:"))
            self.battery_size = battery_size
            self.range = range

    但是执行代码仍然有错,报错和之前一致,局部变量已被赋值。

        message = "This car can go approximately " + str(range)
    UnboundLocalError: local variable 'range' referenced before assignment
    

    那么说明属性range并没有在实例中发挥作用。if条件语句也不会改变range的值,因为判断的条件不满足。

    开始思路2:

     将range定义一个变量,并在作为局部变量放在get_range函数。这样运行是没有问题,但是,里程数只根据range的变量值改变,那么if条件语句也就失去了意义。

     1     def describe_battery(self):
     2         """打印一条描述电瓶容量的信息"""
     3         print("This car has a " + str(self.battery_size) + "kWH battery.")
     4 
     5     def get_range(self):
     6         """打印一条描述电瓶续航的消息"""
     7 
     8         range = 152
     9 
    10         if self.battery_size == 50:
    11             range = 240
    12         elif self.battery_size == 70:
    13             range = 270
    14 
    15 
    16         message = "This car can go approximately " + str(range)
    17         message += "miles on a full charge."
    18         print(message)

    后续的思路是,让用户给出battery_size的值,根据这个值,计算能够运行的里程数。

    假设50kWH可以跑240miles(1miles = 1 609米),那么约为386KM,那么1kWH可以跑7KM,来试试怎么写?

  • 相关阅读:
    .NET CORE 技术债
    .Net Core/Framework之Nginx反向代理后获取客户端IP等数据探索
    托管ASP.NET Core应用程序到Windows服务中
    Office在线预览及PDF在线预览的实现方式大集合
    Ubuntu 16.10 虚拟机安装记录
    .Net Core 之 图形验证码
    Ubuntu之Mysql安装及基本设置
    .Net Core 之 Ubuntu 14.04 部署过程
    常用.net反编译替换正则表达式
    江湖救急:webbrowser中js文件丢失问题~
  • 原文地址:https://www.cnblogs.com/aszeno/p/11168641.html
Copyright © 2011-2022 走看看