写一个函数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)) 你这样的话,每次调用get_digit,insert的不是同一个列表
你这么递归调用的话,每递归一次,函数从头来一次,那列表不是又重新赋值为空了吗?
上次的数值怎么保存到列表呢?
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))
Twilight6 发表于 2020-6-17 08:22
所以你每次递归都算重新赋值,而且变量名相同就会触发屏蔽机制,导致你 insert 的列表永远不是同一个 ...
请问就上边那道题小甲鱼给的答案,result定义的不是全局变量吗?那函数会将全局变量result屏蔽,最后内部函数的变量不是不会影响全局变量的结果吗,为什么最后result的输出不是空列表呢? chong0918 发表于 2020-8-11 20:59
请问就上边那道题小甲鱼给的答案,result定义的不是全局变量吗?那函数会将全局变量result屏蔽,最后内部 ...
return 已经将局部变量的result 返回,所以此时打印的不是空列表
页:
[1]