鱼C论坛

 找回密码
 立即注册
查看: 2711|回复: 5

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

[复制链接]
发表于 2022-9-17 15:28:44 | 显示全部楼层 |阅读模式

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

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

x
情况1:
x=10
def func(x):
    x=x+10
    print(x)

   
func(x)
20


情况2:
x=10
def func():
    x=x+10
    print(x)

   
func()
Traceback (most recent call last):
  File "<pyshell#156>", line 1, in <module>
    func()
  File "<pyshell#154>", line 2, in func
    x=x+10
UnboundLocalError: local variable 'x' referenced before assignment




为什么会出现这样的差异?求解答
最佳答案
2022-9-17 15:38:47
在情况1中
你将x传参给了func函数,于是python就在func函数中创建了一个名叫x的变量,并赋值为10,所以打印了20
在情况2中
x是全局变量,在func函数中,由于你对x变量进行了修改,所以python为了安全会屏蔽掉全局变量x,又由于没有局部变量x,所以报了错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-17 15:38:47 | 显示全部楼层    本楼为最佳答案   
在情况1中
你将x传参给了func函数,于是python就在func函数中创建了一个名叫x的变量,并赋值为10,所以打印了20
在情况2中
x是全局变量,在func函数中,由于你对x变量进行了修改,所以python为了安全会屏蔽掉全局变量x,又由于没有局部变量x,所以报了错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-17 15:39:59 | 显示全部楼层
在第二个函数中 , 它认为你在函数内的 x 是这个函数的局部变量, 而不是函数外面的 x
然后你又没定义这个局部变量x , 所以报错
如果你要这样 , 可以用 global 关键字 , 声明 x 这个变量就是外面的全局变量
x = 10

def func():
    global x
    x += 10
    return None

func()

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

使用道具 举报

 楼主| 发表于 2022-9-17 15:50:14 | 显示全部楼层
临时号 发表于 2022-9-17 15:38
在情况1中
你将x传参给了func函数,于是python就在func函数中创建了一个名叫x的变量,并赋值为10,所以打印了 ...

我是这样理解的:

情况一中:因为有传参行为,所以python在运行这个函数时,重新定义了一个局部变量x,赋值为10,区别于外部的全局变量x=10

情况二中:因为有改值行为python将全局变量屏蔽了,也就是说x=x+10这个式子里两边的x全都是局部变量,因而会报错未提前定义局部变量x

您看我理解的对吗?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-17 15:56:24 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-17 16:03 编辑
x = 10             # x 是全局变量
def func(x):
    x = x + 10     # x 纯粹是局部变量,这样写没有问题
    print(x)
x = 10             # x 是全局变量
def func():
    x = x + 10     # 作为全局变量,x 在函数内不允许赋值,有赋值,则属于创建新的局部变量,与同名全局变量无关,可是,此时 x 需要先访问,才能被赋新值,而这个时候, x 还没有被定义,这就不被允许。    
    print(x)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-17 16:01:55 | 显示全部楼层
因为菜所以卷 发表于 2022-9-17 15:50
我是这样理解的:

情况一中:因为有传参行为,所以python在运行这个函数时,重新定义了一个局部变量x ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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