鱼C论坛

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

[已解决]写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中

[复制链接]
发表于 2020-6-17 02:13:22 | 显示全部楼层 |阅读模式

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

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

x
举例:get_digits(12345) ==> [1, 2, 3, 4, 5]

小甲鱼课后答案:
result = []
def get_digits(n):
        if n > 0:
                result.insert(0, n%10)
                get_digits(n//10)

get_digits(12345)
print(result)

想问一下,为什么不能写成如下代码(萌新提问,求大神尽量细致点解答,谢谢)
def get_digits(n):
    result = []
    if n > 0:
        result.insert(0, n % 10)
        get_digits(n // 10)
    return result

print(get_digits(12345))
最佳答案
2020-6-17 08:22:19


Python 的屏蔽机制:

当函数内部的变量和函数外部全局作用域的变量名相同时,会触发 Python 的屏蔽机制,函数内部会创建一个同名的局部变量

来暂时覆盖同名的全局变量,此时在函数内部的值都为这个局部变量,只要一出此函数,那么该局部变量就不复存在,变会原来的全局变量

所以你每次递归都算重新赋值,而且变量名相同就会触发屏蔽机制,导致你 insert 的列表永远不是同一个 ,你可以通过 return 加上递归后的列表来解决这个问题:
def get_digits(n):
    result = []
    if n > 0:
        result.insert(0, n % 10)
        return  get_digits(n // 10) + result
    else:
        return []

print(get_digits(12345))

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

使用道具 举报

发表于 2020-6-17 07:13:33 | 显示全部楼层
你这样的话,每次调用get_digit,insert的不是同一个列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 08:09:06 | 显示全部楼层
你这么递归调用的话,每递归一次,函数从头来一次,那列表不是又重新赋值为空了吗?

上次的数值怎么保存到列表呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 08:22:19 | 显示全部楼层    本楼为最佳答案   


Python 的屏蔽机制:

当函数内部的变量和函数外部全局作用域的变量名相同时,会触发 Python 的屏蔽机制,函数内部会创建一个同名的局部变量

来暂时覆盖同名的全局变量,此时在函数内部的值都为这个局部变量,只要一出此函数,那么该局部变量就不复存在,变会原来的全局变量

所以你每次递归都算重新赋值,而且变量名相同就会触发屏蔽机制,导致你 insert 的列表永远不是同一个 ,你可以通过 return 加上递归后的列表来解决这个问题:
def get_digits(n):
    result = []
    if n > 0:
        result.insert(0, n % 10)
        return  get_digits(n // 10) + result
    else:
        return []

print(get_digits(12345))

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

使用道具 举报

发表于 2020-8-11 20:59:37 | 显示全部楼层
Twilight6 发表于 2020-6-17 08:22
所以你每次递归都算重新赋值,而且变量名相同就会触发屏蔽机制,导致你 insert 的列表永远不是同一个 ...

请问就上边那道题小甲鱼给的答案,result定义的不是全局变量吗?那函数会将全局变量result屏蔽,最后内部函数的变量不是不会影响全局变量的结果吗,为什么最后result的输出不是空列表呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 21:17:17 | 显示全部楼层
chong0918 发表于 2020-8-11 20:59
请问就上边那道题小甲鱼给的答案,result定义的不是全局变量吗?那函数会将全局变量result屏蔽,最后内部 ...

return 已经将局部变量的  result 返回,所以此时打印的不是空列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 11:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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