python全局变量的问题?

初学者,网站上说,在函数体外定义的变量,一定是全局变量,例如:add="123456"deftext():print("函数体内访问:",add)text()print(... 初学者,网站上说,在函数体外定义的变量,一定是全局变量,例如:
add = "123456"
def text():
print("函数体内访问:",add)
text()
print('函数体外访问:',add)
这样都能拿到add的值
但是这段代码
import threading
num=100
def run(name):
global num
num=num-1
print("线程",name,"执行了!目前num的值为:",num)

for i in range(100):
t=threading.Thread(target=run,args=(i+1,))
t.start()
为什么必须要将num设置为全局变量,不然会报错?num是在函数外设置的变量啊?
展开
 我来答
之了知了
2020-04-22 · TA获得超过172个赞
知道小有建树答主
回答量:342
采纳率:74%
帮助的人:46万
展开全部

在 自定义函数 内定义的变量 默认就是局部变量,在没有额外声明的情况下,你要用这个函数用的就是这个局部变量

结果就是局部变量为num=num-1,因为有局部变量了,所以同名称的全局变量num=100没有引用到,自然就报错了

当然处可以改为不声明全局变量,这样就需要新建一个不同名称的局部变量就可以了

hy1397471
2020-02-27 · 知道合伙人软件行家
hy1397471
知道合伙人软件行家
采纳数:4714 获赞数:17155
15年数据库维护及数据库应用系统开发经验,从事零售业、服务业及财务管理类系统开发与维护。

向TA提问 私信TA
展开全部

看上面的代码,如果不加global,Python解释器认为,num是函数内部声明的局部变量。

追问
那可是我的代码是我在函数外定义num的值他理应就是一个全局变量啊,我不加global他在函数内也应该能取到啊,为什么还要加呢?麻烦您回答下,谢谢。
追答
上面给你举了例子
你不加global,函数内部的num已经指向了新的引用,而不是外部的那个num。
所以再次打印外部num的值,仍然是100。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2020-02-28
展开全部
你这样理解吧,内部变量在使用的时候,会检查外部是否有同名变量,有的话,就是他了;
但是在函数体内对这个变量再次赋值,其实更改的只是函数体内的变量,外部变量没有更改到;
所以,如果你希望定义的外部变量可以在函数体内进行修改,那就要加global,不然的话,函数体内修改是传不到外面的;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我配合的演出
2020-02-27 · TA获得超过192个赞
知道小有建树答主
回答量:150
采纳率:38%
帮助的人:53.8万
展开全部
简单来说就是把global声明去掉之后,num是未定义的,num=num-1是用未定义的一个变量减一再赋值给未定义的变量,报的错就是本地变量未定义。global是声明这个变量在全局环境globals()里。可以把num=100放入到函数中看看结果。上面一个例子,你在函数里加一个add=add[0]试试,也会报错。
追问
请问我给的num=100难道不是给num的定义吗?您说的我没能完全理解
追答
python不允许函数内修改未声明的全局变量,这是限制全局变量范围的约束,不加声明直接改的话,在编写程序中很大程序上会因为别的程序跟全局变量命名相同而出现意外结果
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
战斗机歼_33
2020-02-28 · 超过23用户采纳过TA的回答
知道答主
回答量:195
采纳率:80%
帮助的人:16.7万
展开全部
加上跟global ……就好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式