鱼C论坛

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

[已解决]关于在函数内更改全局变量

[复制链接]
发表于 2018-3-29 01:46:01 | 显示全部楼层 |阅读模式

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

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

x
result = []
def get_digits(n):
        if n > 0:
                result.insert(0, n%10)
                get_digits(n//10)

get_digits(12345)
print(result)



023讲的课后习题。
result.insert(0, n%10) 不是相当于更改了全局变量吗?
如果是我读的话,觉得result会输出 [  ]
  
最佳答案
2018-3-29 20:59:52
本帖最后由 吴阿汤 于 2018-3-29 21:04 编辑

这个问题我恰巧想过的。
一般变量需要在定义函数过程中声明全球变量才可以改变对吧,但是这里的列表呢不一样。
普通变量如果在函数中赋值a = 2会有歧义。因为它既可以是表示引用全局变量a,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global。
而对列表list变量进行赋值则不会有歧义。result=[]它是“明确的”,因为如果把ta当作是局部变量的话,它会报KeyError,所以它只能是引用全局的result,故不需要多此一举显式声明global。
这里有篇文章可以解决你的疑惑。
http://www.jb51.net/article/86765.htm

参考自:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-29 07:50:49 From FishC Mobile | 显示全部楼层

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

使用道具 举报

发表于 2018-3-29 09:17:17 | 显示全部楼层
总结一句话,可变类型是传址(引用),不可变类型是传值(因为不可变类型,每次进行“更改”操作时会创建新对象嘛)
可变类型,有列表,字典,对象神马的
不可变,有整数,字符串,元组神马的。
如果要完全复制可变类型,需要深度拷贝,否则浅度拷贝会让你有欲生欲死的感觉,然而浅度拷贝又非常有用。。。。哎。PYthon的自由度挺高的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 09:36:55 | 显示全部楼层
全局变量全局有效
在哪里改都会改变列表的值。
只有函数里定义了同名的局部变量
全局变量值才不会被改变。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-29 20:59:52 | 显示全部楼层    本楼为最佳答案   
本帖最后由 吴阿汤 于 2018-3-29 21:04 编辑

这个问题我恰巧想过的。
一般变量需要在定义函数过程中声明全球变量才可以改变对吧,但是这里的列表呢不一样。
普通变量如果在函数中赋值a = 2会有歧义。因为它既可以是表示引用全局变量a,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global。
而对列表list变量进行赋值则不会有歧义。result=[]它是“明确的”,因为如果把ta当作是局部变量的话,它会报KeyError,所以它只能是引用全局的result,故不需要多此一举显式声明global。
这里有篇文章可以解决你的疑惑。
http://www.jb51.net/article/86765.htm

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

使用道具 举报

 楼主| 发表于 2018-3-30 15:30:58 | 显示全部楼层
idol 发表于 2018-3-29 09:36
全局变量全局有效
在哪里改都会改变列表的值。
只有函数里定义了同名的局部变量

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-9 21:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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