鱼C论坛

 找回密码
 立即注册
查看: 1582|回复: 7

[已解决]全局变量问题

[复制链接]
发表于 2017-4-29 17:05:52 | 显示全部楼层 |阅读模式
5鱼币
  1. var = ' Hi '

  2. def fun1():
  3.     global var
  4.     var = ' Baby '
  5.     return fun2(var)

  6. def fun2(var):
  7.     var += 'I love you'
  8.     fun3(var)
  9.     return var

  10. def fun3(var):
  11.     var = ' 小甲鱼 '

  12. print(fun1())
复制代码

这里的'global var'是将var定义为全局变量,对吧?那么和最前面的var=‘Hi’是什么关系?是创建一个与var=‘Hi’名字一样的局部变量var吗?
望大佬解答,这几个var到底是什么关系?谢谢。
最佳答案
2017-4-29 17:05:53
刚开始的var='Hi'是定义了一个全局变量,当你在函数内部定义了一个与全局变量同名的局部变量,这个变量的值不会影响全局变量的值,除非你用global声明了这个变量就是全局变量
  1. var = ' Hi '#这是全局变量

  2. def fun1():
  3.    
  4.     global var #声明函数里的这个var就是之前声明的var,全局变量
  5.     var = ' Baby ' #此时的var就是全局的var,所以全局var的值变为'Baby'
  6.     return fun2(var) #将var的值作为fun2()的参数进行处理并返回

  7. def fun2(var): #这里的var是只是fun2()参数的一个名字,就算你把fun2()的全部var换成x,也不影响最后结果
  8.     var += 'I love you'
  9.     fun3(var)  #fun3()也是个带参函数,跟fun2一样,这里不会影响全局变量var的值
  10.     return var

  11. def fun3(var):
  12.     var += ' 小甲鱼 '
  13. print(fun1())

复制代码

fun3(var)不会影响var的值主要是因为全局var是一个不可变类型,不可变类型还包括int,float等,可变类型为序列,如列表,元组,字典
python规定不可变类型值作为函数参数时,其本身不会被修改,只会提供值进行运输,你最后打印一次var,会发现fun2()也没有修改var的值

最佳答案

查看完整内容

刚开始的var='Hi'是定义了一个全局变量,当你在函数内部定义了一个与全局变量同名的局部变量,这个变量的值不会影响全局变量的值,除非你用global声明了这个变量就是全局变量 fun3(var)不会影响var的值主要是因为全局var是一个不可变类型,不可变类型还包括int,float等,可变类型为序列,如列表,元组,字典 python规定不可变类型值作为函数参数时,其本身不会被修改,只会提供值进行运输,你最后打印一次var,会发现fun2()也没 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-29 17:05:53 | 显示全部楼层    本楼为最佳答案   
刚开始的var='Hi'是定义了一个全局变量,当你在函数内部定义了一个与全局变量同名的局部变量,这个变量的值不会影响全局变量的值,除非你用global声明了这个变量就是全局变量
  1. var = ' Hi '#这是全局变量

  2. def fun1():
  3.    
  4.     global var #声明函数里的这个var就是之前声明的var,全局变量
  5.     var = ' Baby ' #此时的var就是全局的var,所以全局var的值变为'Baby'
  6.     return fun2(var) #将var的值作为fun2()的参数进行处理并返回

  7. def fun2(var): #这里的var是只是fun2()参数的一个名字,就算你把fun2()的全部var换成x,也不影响最后结果
  8.     var += 'I love you'
  9.     fun3(var)  #fun3()也是个带参函数,跟fun2一样,这里不会影响全局变量var的值
  10.     return var

  11. def fun3(var):
  12.     var += ' 小甲鱼 '
  13. print(fun1())

复制代码

fun3(var)不会影响var的值主要是因为全局var是一个不可变类型,不可变类型还包括int,float等,可变类型为序列,如列表,元组,字典
python规定不可变类型值作为函数参数时,其本身不会被修改,只会提供值进行运输,你最后打印一次var,会发现fun2()也没有修改var的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-29 17:47:38 | 显示全部楼层
print(id(var))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-29 18:59:01 | 显示全部楼层
最前面的var=‘Hi’是定义一个变量
而'global var'大概就是告诉py,这个var是个全局变量,然后py就会把它当全局变量处理
至于开头的var=‘Hi’要不要都可以,就算一开始没定义var变量,global语句也会告诉py叫做var的变量是全局变量,所以可以在golbal语句后面再对var赋值,你可以删掉开头的var=‘Hi’试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-29 18:59:54 | 显示全部楼层
嗯,我表达的不太好,应该能明白吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-29 19:47:15 | 显示全部楼层
开头的var='Hi'会在你的def fun1( )里的var使用global后被python的机制回收回去 这时候这个var是全局变量  下面的第二个和第三个函数里的var都是局部变量 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-30 16:01:38 | 显示全部楼层
这里的'global var'是将var定义为全局变量,对吧?那么和最前面的var=‘Hi’是什么关系?是创建一个与var=‘Hi’名字一样的局部变量var吗?


我的理解: global并不是将var定义为全局变量。 最前面的var = 'Hi'已经是全局变量了。用global来修饰var,代表可以对var这个全局变量进行修改,否则的话被修改的只是fun1()函数中一个与var名字一模一样的局部变量,而全局变量var='Hi'的值并没有被改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-5-13 17:37:58 | 显示全部楼层
论坛的鱼油好,因为个人原因,我有很久没有来论坛了,这个问题搁置了这么久,我感到很抱歉。十分感谢大家的热心解答,对于全局变量与局部变量我已经明白了。再次感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 03:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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