lzb1001 发表于 2023-5-10 20:56:39

再问全局变量和局部变量

1.var = ' Hi '
2.
3.def fun1():
4.    global var
5.    var = ' Baby '
6.    return fun2(var)
7.
8.def fun2(var):
9.    var += 'I love you'
10.    fun3(var)
11.    return var
12.
13.def fun3(var):
14.    var = ' 小甲鱼 '
15.
16.print(fun1())


为什么运行后返回的结果是Baby I love you?

isdkz 发表于 2023-5-10 20:57:02

在这段代码中,var是一个全局变量,在fun1()函数中,使用global关键字声明了var是全局变量,而不是局部变量。在fun1()函数中,var被赋值为'Baby',然后传递给了fun2()函数。在fun2()函数中,var被修改为' Baby I love you',然后传递给了fun3()函数。在fun3()函数中,var被重新赋值为'小甲鱼',但这并不会影响fun2()函数中的var的值。最后,fun2()函数返回' Baby I love you',并被fun1()函数返回并打印出来。

因此,运行后返回的结果是'Baby I love you'。

sfqxx 发表于 2023-5-10 21:11:09

当`fun1()`被调用时,它定义了一个全局变量`var`并将其初始化为字符串" Hi "。在第5行,它更新了全局变量`var`的值为" Baby "。

接下来,`fun1()`返回调用另一个函数`fun2(var)`的结果。在`fun2(var)`中,在第9行代码中,使用 `+=` 操作符连接字符串 “I love you” 来更新传递给 `fun2()` 的参数 `var` 的值,即使这个值是从调用函数 `fun1()` 中传递的,因此字符串变量 var 的值现在为 " Baby I love you"。

然后,`fun2()`调用 `fun3(var)`,但是在 `fun3`中,对 `var` 进行赋值 "小甲鱼" 并没有影响到 `var` 的值,它只是将 `var` 绑定到一个新对象上,因此不会改变 `var` 的值。 最后,在main函数中,打印由 `fun1()` 返回的 `fun2(var)` 的结果, `fun2(var)` 的值为 "Baby I love you" ,因此这就是将会被打印到控制台上的值。
有用请设置最佳答案

lzb1001 发表于 2023-5-10 23:02:55

本帖最后由 lzb1001 于 2023-5-10 23:08 编辑

isdkz 发表于 2023-5-10 20:57
在这段代码中,var是一个全局变量,在fun1()函数中,使用global关键字声明了var是全局变量,而不是局部变量 ...

大神请帮忙看看每行代码后的#:一是看看a - i的顺序和注释对不对?二是有3处???的地方不明

1.var = ' Hi ' # a定义var全局变量
2.
3.def fun1():
4.        global var # c使用global关键字声明var是全局变量
5.        var = ' Baby ' # d将var重新赋值为'Baby'
6.        return fun2(var) # e将新的var的值传入fun2()函数并返回
7.
8.def fun2(var):
9.        var += 'I love you' # f将var的值修改为' Baby I love you'
10.        fun3(var) # g将新的var的值传入fun3()函数
        return var # i返回……???所以实际print(fun1())也就是返回并打印这里的var的值???
11.
12.def fun3(var):
        var = ' 小甲鱼 ' # h将var重新赋值为'小甲鱼'
13.
14.
15.print(fun1()) # b将fun1()函数的值返回并打印出来(实际打印的是fun2()函数中return var???)
16.
17.

isdkz 发表于 2023-5-10 23:13:38

本帖最后由 isdkz 于 2023-5-10 23:15 编辑

lzb1001 发表于 2023-5-10 23:02
大神请帮忙看看每行代码后的#:一是看看a - i的顺序和注释对不对?二是有3处???的地方不明

1.var ...

你的注释大部分都是正确的,但我有几个小修正和补充:

1.var = ' Hi ' # a定义var全局变量
2.
3.def fun1():
4.global var # c使用global关键字声明var是全局变量
5.var = ' Baby ' # d将全局变量var重新赋值为'Baby'
6.return fun2(var) # e将新的全局变量var的值传入fun2()函数并返回其结果
7.
8.def fun2(var):
9.var += 'I love you' # f将局部变量var的值修改为' Baby I love you'
10.fun3(var) # g将新的局部变量var的值传入fun3()函数
11.return var # i返回局部变量var,即fun2函数的结果,这将作为fun1函数的结果返回,并最终被打印出来
12.
13.def fun3(var):
14.var = ' 小甲鱼 ' # h将局部变量var重新赋值为'小甲鱼',但这并不会影响fun2或fun1中的var
15.
16.print(fun1()) # b调用fun1()函数,并打印其返回值

在这段代码中,需要注意的是var在不同的函数中可以有不同的值和作用域。在fun1中,var是全局变量,而在fun2和fun3中,var是局部变量。因此,尽管在fun3中var被赋值为'小甲鱼',但这并不会影响fun2和fun1中的var。

lzb1001 发表于 2023-5-10 23:44:59

本帖最后由 lzb1001 于 2023-5-11 00:08 编辑

isdkz 发表于 2023-5-10 23:13
你的注释大部分都是正确的,但我有几个小修正和补充:

1.var = ' Hi ' # a定义var全局变量


感谢大神,

在你的基础上进一步完善,每一行解释得清清楚楚,配置字母,代码运行的先后顺序就很清晰明了了


1.var = ' Hi ' # a定义全局变量var并赋值为' Hi '
2.
3.def fun1(): # 定义fun1()函数
4.    global var # c使用global关键字声明var是全局变量
5.    var = ' Baby ' # d将全局变量var重新赋值为' Baby ',注意:Baby前后各有一个空格!
6.    return fun2(var) # e将新的全局变量var的值' Baby '传入fun2()函数并返回其结果
7.
8.def fun2(var): # 定义fun2()函数
9.    var += 'I love you' # f将局部变量var的值修改为' Baby ' + 'I love you'即' Baby I love you',注意:Baby前有一个空格!
10.    fun3(var) # g将新的局部变量var的值' Baby I love you'传入fun3()函数
return var # i返回fun2()函数中局部变量var的值即fun2()函数的结果,这将作为fun1()函数的结果返回,并最终被打印出来
11.
12.def fun3(var): # 定义fun3()函数
var = ' 小甲鱼 ' # h将局部变量var重新赋值为'小甲鱼',但这并不会影响fun2()函数中的局部变量var的值(仍然是' Baby I love you')或fun1()函数中的全局变量var的值(仍然是' Baby ')
13.
14.
15.print(fun1()) # b调用fun1()函数,并打印其返回值
16.
17.

isdkz 发表于 2023-5-10 23:46:17

lzb1001 发表于 2023-5-10 23:44
感谢大神,

每一行解释得清清楚楚,配置字母,代码运行的先后顺序就很清晰明了了

不客气,来个最佳支持一下呗{:5_109:}

Axiujiu 发表于 2023-5-11 08:57:32

谢谢,学到了学到了,感激我的好兄弟
页: [1]
查看完整版本: 再问全局变量和局部变量