lzb1001 发表于 2023-5-10 15:33:33

全局变量与局部变量

本帖最后由 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)两个变量的存放空间不同,其中哪个是存放在函数的栈空间内,哪个是存放在其他空间内?

isdkz 发表于 2023-5-10 15:33:58

1、在函数内部,如果使用了和全局变量同名的变量,Python会默认将其认为是一个局部变量,而不是全局变量。因此,当我们在函数内部修改old_price的值时,实际上是在修改一个新的局部变量old_price,而不是全局变量old_price。

2、局部变量和全局变量的存放位置确实不同。局部变量是存放在函数的栈空间中,而全局变量是存放在全局变量表中。在Python中,所有的变量都是对象,它们会被存放在内存中的不同位置。局部变量在函数调用时被创建,函数结束时被销毁,而全局变量则在程序运行期间一直存在,直到程序结束。

sfqxx 发表于 2023-5-10 19:34:26

1. 在函数内定义的变量如果与全局变量同名,Python 将会在函数内部创建一个新的局部变量,其优先级高于全局变量,并且并不会修改全局变量。因此在函数中 `old_price` 的值为局部变量的值50,而不是全局变量的100。如果想要修改全局变量的值,在函数内需要使用关键字"global"来声明。

2. 局部变量和全局变量都存放在堆栈空间中,所存储的位置是相同的,区别只在于它们有不同的作用域。局部变量只能在其被定义的函数体内访问,全局变量在整个程序中都可以被访问。
有用请设置最佳答案

陶远航 发表于 2023-5-13 13:59:40

当在函数内试图修改一个同名的全局变量时,Python会创建一个新的同名局部变量作为修改的目标,并不会真正改变全局变量的值。因此,在函数内打印出来的是新的局部变量old_price的值,而不是真正的全局变量old_price的值。

在Python中,局部变量存放在函数的栈空间中,而全局变量存放在全局存储区中。因此,局部变量old_price=50存放在函数的栈空间中,而全局变量old_price(等于我们输入的100)存放在全局存储区中。
页: [1]
查看完整版本: 全局变量与局部变量