哪位大佬帮忙看看第三行代码需要加#号,不然会报错是为啥
def discounts(price, rate):final_price = price * rate
# print('这里试图打印全局变量old_price的值', old_price)
old_price = 50
print('修改后old_price的值是1;', old_price)
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price, rate)
print('修改后old_price的值是2;', old_price)
print('打折后价格是:', new_price)
因为你第四行对全局变量赋值了,使得 old_price 这个参数暂时变成了局部变量,导致报错NameError,你只需要在最前面一行加上 global old_price 声明下即可避免报错 本帖最后由 青出于蓝 于 2020-7-7 18:36 编辑
报错内容?
我改改 本帖最后由 Twilight6 于 2020-7-7 18:48 编辑
2L 说的总体上没错哈,但是报错的是 UnboundLocalError 在赋值之前引用了变量 ,你实际上传入参数时候 : new_price = discounts(old_price, rate)
第一个参数就是你的 old_price ,所以到函数内部时候 price 就代表你传入的 old_price 的值了,此时你打印
price 就代表打印了 old_price了所以你代码这样改就好了:
def discounts(price, rate):
final_price = price * rate
print('这里试图打印全局变量old_price的值', price)
old_price = 50
print('修改后old_price的值是1;', old_price)
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price, rate)
print('修改后old_price的值是2;', old_price)
print('打折后价格是:', new_price)
顺便给你说下为什么 2L 那种情况会报错,先来了解下 Python 的屏蔽机制:
当函数内部的变量和函数外部全局作用域的变量名相同时,会触发 Python 的屏蔽机制,函数内部会创建一个同名的局部变量
来暂时覆盖同名的全局变量,此时在函数内部的值都为这个局部变量,只要一出此函数,那么该局部变量就不复存在,变会原来的全局变量
所以报错原因就是因为你 old_price = 50 这里赋值了 ,导致这个函数作用域内 old_price = 50 参数是局部变量,此时的全局变量被屏蔽了,然后你 print 打印的时候,就因为全局变量的 old_price 被屏蔽了
old_price参数还没定义而报错,所以你不能直接这样打印哈,但是 2L 的方法会直接改变全局变量的值了
页:
[1]