1. result 在 get_digits(n) 内部是没有被定义的。如果函数在函数体范围内找不到相关的变量(先不要管是局部还是全局变量),就会往那一行代码之前的代码搜索。result.append() 在第 5 行,往 4 - 1 行搜索,结果就在第 1 行找到了,所以第 5 行的 result 会对应到函数体外的变量。但真正调用 get_digits() 是在第 8 行,所以应该是往 7 - 1 行搜索。如果变量的定义在被调用的时候没有被定义,就会报错。自己尝试把 result 还有 def 的位置换到不同的地方。
2. 没错,如果 result = [] 放到函数内部的话,就是说函数每被调用一次,就会制造一个空列表。函数把结果返回之后,就会把函数内部变量所占的内存给清空。结果就是每次会重置。
3. 注意,这个函数是递归呼叫。看看第 4 行 result = get_digits(n//10),那么 get_digits(n//10) 就调用 get_digits(n) ,而里边又要找 result = get_digits() ... 就是一直找不到就对了,所以不能放在函数外部。
我们剖析一下您的代码(我简化一下):
get(12345) ## 在第 8 行呼叫函数
r = []
if 12345: ## n != 0 == True
r = get(1234)
r = r + '5'
呼叫 get(1234) 变成:
r = []
if 12345:
r = []
if 1234:
r = r + '4'
r = r + '5'
...
结果会是 result 被初始化了好几次,最后 []+'1' + '2'+...+'5'
4. 最大的差别在于有没有赋值。代码一:get_digits(n // 10) 代码二:result = get_digits(n //10)。代码一因为没有 result =,所以不会一直去找 result 在哪里,只是知道 result 已经被定义,最后把运算结果附在一起 (append >> appendix >> 附录)。代码二则一直强调函数要改变 result 的值。
如果 result = [] 在代码一的函数内部,结果并不会是全空,最后一个打印出来的结果是有值的。效率上来说,代码一比较好,干净且省事。