鱼C论坛

 找回密码
 立即注册
查看: 1594|回复: 3

[已解决]哪位大佬帮忙看看第三行代码需要加#号,不然会报错是为啥

[复制链接]
发表于 2020-7-7 18:19:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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)
最佳答案
2020-7-7 18:34:50
本帖最后由 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 的方法会直接改变全局变量的值了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-7 18:22:40 | 显示全部楼层
因为你第四行对全局变量赋值了,使得 old_price 这个参数暂时变成了局部变量,导致报错NameError,你只需要在最前面一行加上 global old_price 声明下即可避免报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-7 18:27:06 | 显示全部楼层
本帖最后由 青出于蓝 于 2020-7-7 18:36 编辑

报错内容?
我改改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 18:34:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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 的方法会直接改变全局变量的值了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 04:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表