python之局部变量引用赋值前的结果

本文介绍了一个使用正则表达式实现基本加减运算的计算器。文章详细解释了如何通过正则表达式对输入的数学表达式进行解析,并利用递归函数进行计算。同时,针对出现的局部变量未定义错误进行了讨论并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过正则表达式,实现加减

 

  昨晚在做计算器的时候,被一个BUG搞懵比了。现在再看看,发现我好小白啊~~

 

 

复制代码
 1 #8+5+65
 2 num = input("please input:")
 3 sa = re.split(r'(\D)', num)   #区配到非数字则分割
 4 
 5 
 6 def func(s):
 7     #result = 0
 8     if s[1] == '+':
 9         result = int(s[0]) + int(s[2])
10     elif s[1] == '-':
11         result = int(s[0]) - int(s[2])
12 
13     for i in range(3):  # 去掉前三个
14         s.remove(s[0])
15 
16     s.insert(0, result)   #BUG:Local variable 'result' might be referenced before assignment more..局部变量引用赋值前的结果
17     print(s)
18 
19     if len(s) == 1:
20         print(result)
21     else:
22         func(s)
23 
24 func(sa)
复制代码

 

注意第16行!!!

其实我昨晚运行的时候是有显示有BUG的:

UnboundLocalError: local variable 'result' referenced before assignment

但是今天运行竟然没有显示错误了!邪了~

 

但是不管怎样,pycharm 16行那里result都有下划线,提示:

Local variable 'result' might be referenced before assignment

 

怎么解决呢?

我早上又起来试试,在第7行加上result = 0,就可以了!

因为(我觉得)if/elif……里面都是一个范围 ,有对result进行赋值,但在if/elif……外面是看不到的。

相当于局部变量s 引用了变量result赋值前的结果。

 

 

转发注明出处,谢谢。

 

### 局部变量声明与作用域 在 Python 中,局部变量是在函数内部创建并使用的变量。这些变量仅在其定义的函数内可见,并且当函数执行完毕后会被销毁。Python 不像C/C++那样需要显式声明变量类型,在给定赋值之前不需要提声明局部变量的存在。 然而,如果希望在实际赋值操作发生让解释器知道某个名称应作为局部变量处理,则可以利用 `nonlocal` 或者 `global` 关键字来改变默认的作用域规则[^1]。但是这并不是真正意义上的“声明”,而是指明特定名字应该绑定到外部作用域或全局命名空间中。 对于简单的局部变量来说,通常的做法就是在首次使用该变量时直接对其进行赋值: ```python def example_function(): # 这里并没有事先声明x为局部变量 x = 42 # 当第一次遇到这个语句的时候,x就被认为是一个新的局部变量了 print(f"The value of local variable 'x' is {x}") ``` 需要注意的是,尝试打印未初始化的局部变量会导致错误,因为直到对其进行了有效的赋值之后它才存在: ```python def change_local(): try: print(animal) # 尝试访问尚未定义的局部变量animal会引发NameError异常 except NameError as e: print(e) animal = "cat" print(f"Now animal has been set to '{animal}'") ``` 上述代码展示了试图读取一个还没有被赋予任何值得局部变量将会抛出 `NameError` 错误;而一旦为其分配了一个具体的值以后就可以正常工作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值