鱼C论坛

 找回密码
 立即注册
查看: 2632|回复: 6

关于局部函数问题

[复制链接]
发表于 2016-1-4 21:47:35 | 显示全部楼层 |阅读模式

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

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

x
def get_digits(n):
        result = []
        if n > 0:
                result.insert(0, n%10)
                get_digits(n//10)
               
        return result
print(get_digits(12345))

为什么上面的程序执行出来的是是【5】呢,我怎么感觉应该是1呢???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-4 22:05:14 | 显示全部楼层
我在你的程序里加了打印语句,这样可以看清楚些。
由于有result=[],每次递归都会生成一个新的result变量,当递归完成后,逐级返回,最外层的result就是[5],所以返回到主程序的就是[5]。
  1. def get_digits(n):
  2.         result = []
  3.         if n > 0:
  4.                 result.insert(0, n%10)
  5.                 print(result,id(result))
  6.                 get_digits(n//10)
  7.                
  8.         return result
  9. a = get_digits(12345)
  10. print(a, id(a))
复制代码

输出
  1. [5] 55737288
  2. [4] 55734856
  3. [3] 44195592
  4. [2] 55736776
  5. [1] 55737800
  6. [5] 55737288
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-4 22:40:59 | 显示全部楼层
冬雪雪冬 发表于 2016-1-4 22:05
我在你的程序里加了打印语句,这样可以看清楚些。
由于有result=[],每次递归都会生成一个新的result变量 ...

了解了  非常感谢。
另外,我再问个问题:
result = []
def get_digits(n):
        if n > 0:
                result.insert(0, n%10)
                get_digits(n//10)

get_digits(12345)
print(result)
这个程序中,result作为全局变量,在函数中进行了修改,按说不是不改变作为全局变量的值吗??
但是打印结果却是改变了,求解答,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-4 22:54:00 | 显示全部楼层
dreamfly5590 发表于 2016-1-4 22:40
了解了  非常感谢。
另外,我再问个问题:
result = []

与前面的程序不同的是这里只有一次赋值result=[],
函数内部都是.insert。
我们知道列表属于可变变量,函数内每次调用都在原地址修改,所以就修改了全局变量的值,你可以在主程序和函数内打印result的地址看看。
而当变量是一个数值(不可变变量)时,比如主程序 x=10,在函数中重新赋值 x=5,则不会改变主程序的x。
所以在函数中要慎用列表的方法,避免带来意想不到的结果。当然有意为之的另说。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-4 22:59:58 | 显示全部楼层
冬雪雪冬 发表于 2016-1-4 22:54
与前面的程序不同的是这里只有一次赋值result=[],
函数内部都是.insert。
我们知道列表属于可变变量, ...

谢谢 我按照您说的打印了result的地址,确实是每次都一样的地址,是在原地址的基础上,对列表中的数值进行了修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-8 07:45:43 | 显示全部楼层
怎么打印地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-8 15:25:32 | 显示全部楼层

print(id(变量名))
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-19 02:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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