$ivicky 发表于 2020-6-17 02:13:22

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

举例:get_digits(12345) ==>

小甲鱼课后答案:
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))

qiuyouzhi 发表于 2020-6-17 07:13:33

你这样的话,每次调用get_digit,insert的不是同一个列表

heidern0612 发表于 2020-6-17 08:09:06

你这么递归调用的话,每递归一次,函数从头来一次,那列表不是又重新赋值为空了吗?

上次的数值怎么保存到列表呢?

Twilight6 发表于 2020-6-17 08:22:19



Python 的屏蔽机制:

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

来暂时覆盖同名的全局变量,此时在函数内部的值都为这个局部变量,只要一出此函数,那么该局部变量就不复存在,变会原来的全局变量
所以你每次递归都算重新赋值,而且变量名相同就会触发屏蔽机制,导致你 insert 的列表永远不是同一个 ,你可以通过 return 加上递归后的列表来解决这个问题:
def get_digits(n):
    result = []
    if n > 0:
      result.insert(0, n % 10)
      returnget_digits(n // 10) + result
    else:
      return []

print(get_digits(12345))

chong0918 发表于 2020-8-11 20:59:37

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

请问就上边那道题小甲鱼给的答案,result定义的不是全局变量吗?那函数会将全局变量result屏蔽,最后内部函数的变量不是不会影响全局变量的结果吗,为什么最后result的输出不是空列表呢?

Twilight6 发表于 2020-8-11 21:17:17

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

return 已经将局部变量的result 返回,所以此时打印的不是空列表
页: [1]
查看完整版本: 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中