鱼C论坛

 找回密码
 立即注册
查看: 1138|回复: 13

请教全局变量

[复制链接]
发表于 2019-1-16 20:06:13 | 显示全部楼层 |阅读模式

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

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

x
var = 'Hi'
def fun1():
    global var
    var='Baby'
    return fun2(var)

def fun2(var):
    var +='I love you'
    fun3(var)
    return var

def fun3(var):
    var='小甲鱼'

print(fun1())


BabyI love you
>>>

我想问一下,fun2(var)函数中,var += ‘i love you’ 这里的var是全局变量吗???  如果不是全局变量,那为什么这里的var的值可以改变?

那为什么fun3(var)中的var是局部变量,只有fun3(var)中的var是局部变量,print(fun1())才会打印   BabyI love you

请教大佬解释一些,有点绕
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-16 20:39:58 | 显示全部楼层
本帖最后由 _摆架_回宫、 于 2019-1-16 20:56 编辑

var = 'Hi'
def fun1():
    global var
    var='Baby'
    return fun2(var)    #这里var是局部变量'baby'

def fun2(var):      #到了这里var= baby
    var +='I love you'   #这里拼接了一下 baby i love you
    fun3(var)               #这里  fun3()括号里的内容是 上面那个
    return var     #这里var 返回没有人接受呀

def fun3(var):    #这里是FUN2里调用的 ,括号里内容是 baby i love you
    var='小甲鱼'  #这里有赋值了一个局部变量 也没有打印啥都没干                     

print(fun1())


BabyI love you  #所以这里打印的结果是 fun1()返回的值,因为你的fun1()返回的是他return的结果, 第二返回了没人接受,第三个没返回!默认返回namo
>>>

补充下:所有函数下没有global  声明的变量都是局部变量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-16 20:41:39 | 显示全部楼层
_摆架_回宫、 发表于 2019-1-16 20:39
var += ‘i love you’ 这里的var是全局变量吗???
不是,因为你把它给return过来了。

不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-16 20:43:43 | 显示全部楼层
1.fun2(var)函数中,var是局部变量,为什么var能改变是因为在定义fun2(var)函数中,
有位置变量var,所以fun1()中的var能进入fun2(var)函数中。

2.fun3(var)中的var是局部变量是因为fun3(var)中的var没有用nonlocal修改它,这其实可以写成以下形式:
def fun2(var):
    var +='I love you'
    def fun3(var):
            var='小甲鱼'
    return var
fun3(var)函数中没有return返回值所以就算执行fun3(var)函数也不会改变fun2(var)函数的返回值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-16 21:05:29 | 显示全部楼层
_摆架_回宫、 发表于 2019-1-16 20:39
var = 'Hi'
def fun1():
    global var

你好,你说fun2中的var+='I love you'拼接,是对局部变量var的修改吗,这个var相对于fun3(var)中的var是全局变量,所以fun3(var)中对重新定义了一个局部变量var不影响fun2中的var的值,所以fun2中return var返回的是拼接之后的var的值,返回给fun2,你说的var返回没有人接受的话,那么怎么会打印BabyI love you ??
  我是这样理解的   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-17 00:34:12 | 显示全部楼层
本帖最后由 _摆架_回宫、 于 2019-1-17 00:40 编辑
hualuo 发表于 2019-1-16 21:05
你好,你说fun2中的var+='I love you'拼接,是对局部变量var的修改吗,这个var相对于fun3(var)中的var是 ...


'baby'+'I love you'赋值给了fun2中的局部变量var 然后你的程序FUN2又Return var,也就fun2返会'baby'+'I love you'
所以你打印fun1那么他返回的是fun2,可是fun2是一个函数他也是有返回值的,就是上面我说的fun2返回的那个字符串。
有点绕了。哈哈哈
你记得所有函数下的变量,名字虽然跟全局一样但是他是一个局部的变量,在你没声明之前。


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-17 08:42:08 | 显示全部楼层
本帖最后由 heidern0612 于 2019-1-18 07:46 编辑

1、fun2(var)函数中,var += ‘i love you’ 这里的var是全局变量吗???

不是全局变量,因为上面未声明global var。不声明的话,只是函数内部变量。



2、那为什么fun3(var)中的var是局部变量,只有fun3(var)中的var是局部变量,print(fun1())才会打印   BabyI love you

因为这里的var没有声明是全局变量,他只是个函数内部的局部变量,影响不了全局变量的值。

虽然fun3里面这个var和fun2以及fun1里的var名字一样,但是并不是同一个变量。

就像你的钢笔和我的钢笔类似,虽然都是钢笔,但是并不属于同一个人,形状和颜色也可能不一样。



但是全局变量不同,任何有关全局变量的操作都会影响到外部的var值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-17 18:09:05 | 显示全部楼层
heidern0612 发表于 2019-1-17 08:42
1、fun2(var)函数中,var += ‘i love you’ 这里的var是全局变量吗???

是全局变量,因为上面声明了 ...

你好,你的第二条我理解了,但是第一条我有不同意见,你在第二条中说fun3中的var是局部变量,为什么fun2中的var就不是局部变量了呢?global只出现在了fun1中,而且我执行print(var)打印出来的也是Baby,不是BabyI love you
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-17 18:13:36 | 显示全部楼层
本帖最后由 heidern0612 于 2019-1-17 18:25 编辑
hualuo 发表于 2019-1-17 18:09
你好,你的第二条我理解了,但是第一条我有不同意见,你在第二条中说fun3中的var是局部变量,为什么fun2 ...


fun2的var也是局部变量啊。

但是最后把var的值return给了fun2(),也就是说:

当前调用fun2的话,return的值当前就是前面gloab之后的var值+当前局部变量的var值 = Baby(fun1中global) +I love you(fun2中的内部变量)=Baby i love you

最后print的结果是fun1,fun1最终return的结果不就是调用fun2()么? 也就是上面那一串。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-17 20:28:45 | 显示全部楼层
heidern0612 发表于 2019-1-17 18:13
fun2的var也是局部变量啊。

但是最后把var的值return给了fun2(),也就是说:

你看记录,紫色的,分为两条说的,第一条有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-18 07:46:01 | 显示全部楼层
hualuo 发表于 2019-1-17 20:28
你看记录,紫色的,分为两条说的,第一条有问题

噢,写错了,不好意思。这里的fun只是内部变量,不是全局变量。谢谢指出。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-19 13:01:02 | 显示全部楼层
heidern0612 发表于 2019-1-18 07:46
噢,写错了,不好意思。这里的fun只是内部变量,不是全局变量。谢谢指出。

谢谢解答
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-19 15:24:49 | 显示全部楼层

不客气
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-13 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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