鱼C论坛

 找回密码
 立即注册
查看: 1188|回复: 9

[已解决]第23讲课后作业1

[复制链接]
发表于 2020-7-29 11:24:28 | 显示全部楼层 |阅读模式

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

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

x
请教一下各位大佬一个小问题:
第23讲习题1:
result = []
def get_digits(n):
        if n > 0:
                result.insert(0, n%10)
                get_digits(n//10)

get_digits(12345)
print(result)

result不需要用global关键字,是不是因为global只针对变量,而列表、元组这种不需要呢?
谢谢~
最佳答案
2020-7-29 11:33:24
看下我总结的这个帖子的第四部分:global 与 nonlocal 使用的一个细节分析
为什么在函数中使用全局变量的时候,有时候需要使用关键字 global,而有时候则不需要关键字 global 呢?
python 编程语言,尽量的避免复杂化
像 int 、 float 、 str 等类型是一类不可变类型,所谓不可变类型,就是定义即赋值,修改实际上是新的定义,这一类变量的定义和修改都是使用赋值运算符 '='。
像 list 、 set 、 dict 等类型是一类可变类型,所谓可变类型,就是定义之后,还可以对变量进行修改,修改前后,该变量的 id 不变,这一类变量定义使用赋值运算符,修改则需要下标(或键),还可以有插入、删除等操作。
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用 global 进行明确指出。
对于可变类型,则不存在这种歧义,若是在函数内部修改一个与全局变量同名的变量,不会被认为是要创建一个同名的局部变量(因为修改和定义方式是不一样的),当在函数内没有定义一个与全局变量同名的局部变量,那么修改一个同名的变量时,能够明确就是修改全局变量。因此在函数内若使用一个可变类型的全局变量时不需要使用 global 明确指出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-29 11:26:18 | 显示全部楼层
列表,字典这些东西,是建立在栈上的,所以是全局的,不需要声明全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 11:28:07 | 显示全部楼层


列表、元组、字典都属于容器类型的值

只要不对容器本身进行改变,就不会触发屏蔽效果

此时我们就可以对容器内的元素进行修改,但是当你直接改变容器本身,就会触发屏蔽效果


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 11:31:26 | 显示全部楼层
Twilight6 发表于 2020-7-29 11:28
列表、元组、字典都属于容器类型的值

只要不对容器本身进行改变,就不会触发屏蔽效果

改变容器本身指的是修改名称吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 11:32:14 | 显示全部楼层
1q23w31 发表于 2020-7-29 11:26
列表,字典这些东西,是建立在栈上的,所以是全局的,不需要声明全局变量

OK
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 11:32:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 11:32:44 | 显示全部楼层
老牛第一名 发表于 2020-7-29 11:31
改变容器本身指的是修改名称吗



是指重新对容器赋值另一个容器,比如说你全局变量   a = [1,2,3] ,此时你重新对 a = [4,5,6] 就会让这个作用空间触发屏蔽机制

屏蔽全局变量 a ,创建个局部变量 a,暂时覆盖全局变量


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 11:33:24 | 显示全部楼层    本楼为最佳答案   
看下我总结的这个帖子的第四部分:global 与 nonlocal 使用的一个细节分析
为什么在函数中使用全局变量的时候,有时候需要使用关键字 global,而有时候则不需要关键字 global 呢?
python 编程语言,尽量的避免复杂化
像 int 、 float 、 str 等类型是一类不可变类型,所谓不可变类型,就是定义即赋值,修改实际上是新的定义,这一类变量的定义和修改都是使用赋值运算符 '='。
像 list 、 set 、 dict 等类型是一类可变类型,所谓可变类型,就是定义之后,还可以对变量进行修改,修改前后,该变量的 id 不变,这一类变量定义使用赋值运算符,修改则需要下标(或键),还可以有插入、删除等操作。
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用 global 进行明确指出。
对于可变类型,则不存在这种歧义,若是在函数内部修改一个与全局变量同名的变量,不会被认为是要创建一个同名的局部变量(因为修改和定义方式是不一样的),当在函数内没有定义一个与全局变量同名的局部变量,那么修改一个同名的变量时,能够明确就是修改全局变量。因此在函数内若使用一个可变类型的全局变量时不需要使用 global 明确指出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 11:33:44 | 显示全部楼层
Twilight6 发表于 2020-7-29 11:32
是指重新对容器赋值另一个容器,比如说你全局变量   a = [1,2,3] ,此时你重新对 a = [4,5,6] 就会让 ...

哦哦好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 11:37:52 | 显示全部楼层
就不一一回复了,谢谢各位大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 17:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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