鱼C论坛

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

[已解决]全局变量与局部变量

[复制链接]
发表于 2023-5-10 15:33:33 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 lzb1001 于 2023-5-10 15:35 编辑

# p6_4.py

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)

运行后:

请输入原价:100
请输入折扣率:0.8
修改后old_price的值是1: 50 # 这里打印的是函数内局部变量old_price的值!
修改后old_price的值是2: 100.0 # 这里打印的是函数外全局变量old_price的值!
打折后的价格是: 80.0


【我的疑问】

1、上面代码中的局部变量不是我们自己在函数内定义并赋值的吗old_price = 50?为什么小甲鱼说当我们试图在函数内修改全局变量old_price,PYTHON会创建一个新的局部变量代替,它的名字跟全局变量一模一样,也就是新的局部变量名也叫old_price

2、上面代码中,局部变量old_price = 50、全局变量old_price(等于我们输入的100)两个变量的存放空间不同,其中哪个是存放在函数的栈空间内,哪个是存放在其他空间内?
最佳答案
2023-5-10 15:33:58
1、在函数内部,如果使用了和全局变量同名的变量,Python会默认将其认为是一个局部变量,而不是全局变量。因此,当我们在函数内部修改old_price的值时,实际上是在修改一个新的局部变量old_price,而不是全局变量old_price。

2、局部变量和全局变量的存放位置确实不同。局部变量是存放在函数的栈空间中,而全局变量是存放在全局变量表中。在Python中,所有的变量都是对象,它们会被存放在内存中的不同位置。局部变量在函数调用时被创建,函数结束时被销毁,而全局变量则在程序运行期间一直存在,直到程序结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-10 15:33:58 | 显示全部楼层    本楼为最佳答案   
1、在函数内部,如果使用了和全局变量同名的变量,Python会默认将其认为是一个局部变量,而不是全局变量。因此,当我们在函数内部修改old_price的值时,实际上是在修改一个新的局部变量old_price,而不是全局变量old_price。

2、局部变量和全局变量的存放位置确实不同。局部变量是存放在函数的栈空间中,而全局变量是存放在全局变量表中。在Python中,所有的变量都是对象,它们会被存放在内存中的不同位置。局部变量在函数调用时被创建,函数结束时被销毁,而全局变量则在程序运行期间一直存在,直到程序结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 19:34:26 | 显示全部楼层
[b]1. 在函数内定义的变量如果与全局变量同名,Python 将会在函数内部创建一个新的局部变量,其优先级高于全局变量,并且并不会修改全局变量。因此在函数中 `old_price` 的值为局部变量的值50,而不是全局变量的100。如果想要修改全局变量的值,在函数内需要使用关键字"global"来声明。

2. 局部变量和全局变量都存放在堆栈空间中,所存储的位置是相同的,区别只在于它们有不同的作用域。局部变量只能在其被定义的函数体内访问,全局变量在整个程序中都可以被访问。
有用请设置最佳答案
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-13 13:59:40 | 显示全部楼层
当在函数内试图修改一个同名的全局变量时,Python会创建一个新的同名局部变量作为修改的目标,并不会真正改变全局变量的值。因此,在函数内打印出来的是新的局部变量old_price的值,而不是真正的全局变量old_price的值。

在Python中,局部变量存放在函数的栈空间中,而全局变量存放在全局存储区中。因此,局部变量old_price=50存放在函数的栈空间中,而全局变量old_price(等于我们输入的100)存放在全局存储区中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 05:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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