鱼C论坛

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

[已解决]关于局部变量和递归的问题

[复制链接]
发表于 2019-1-2 23:04:52 | 显示全部楼层 |阅读模式

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

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

x
1.关于局部变量:
result = []
def get_digits(n):
        if n > 0:
                result.insert(0, n%10)
                get_digits(n//10)

get_digits(12345)
print(result)
以上是小甲鱼零基础python24讲动动手第二题的答案代码。虽然我能够理解,但是这个result的list在函数外,应该被当做全局变量,那么按照上课讲的内容,在函数体内的result应该是和全局变量同名的局部变量?这样的话为什么最后输出的result还是正确的,不是一个空的list呢?

2.关于递归
#decimal to binary
def binary(x, result = []):
    if(x == 0):
        result.append(0)
        for i in range(len(result)):
            print(result.pop(),end = '')
    elif(x == 1):
        result.append(1)
        for i in range(len(result)):
            print(result.pop(),end = '')
    else:
        result.append(x%2)
        binary(x//2,result)
以上是我自己的十进制转化二进制的代码,作业要求是用递归,我虽然调用了函数自身,但仔细一想好像不符合课上讲的要“归”的过程,就是没有到达结束条件后,一层一层返回的过程。不知道这个算不算是递归?
最佳答案
2019-1-3 09:21:41
  1. price = 90
  2. def ChangePrice():
  3.     price = 88//[color=Red]这个语句有歧义:1、可以是创建局部变量。2、修改全局变量。所以默认为创建局部变量[/color]
  4.     print('函数内修改后的价格:',price)
  5. print('最终的价格:',price)
复制代码
  1. result = []
  2. def get_digits(n):
  3.         if n > 0:
  4.                 result.insert(0, n%10)//[color=Red]这个语句非常明确,就是修改全局变量。如果你把这个改成result = [];result.insert(0, n%10);那么result就是局部变量,因为他是有歧义的,默认创建局部变量[/color]
  5.                 get_digits(n//10)

  6. get_digits(12345)
  7. print(result)
复制代码

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

使用道具 举报

发表于 2019-1-2 23:33:32 | 显示全部楼层
本帖最后由 Stubborn 于 2019-1-2 23:44 编辑

函数可以调用全局变量啊。这里的是全局变量。不是局部变量。自身调用自身的函数就叫递归函数,,在python中1可以看做True,0可以看做False
  1. result = []
  2. def get_digits(n):
  3.     result1 = [1,2,3]
  4.     if n > 0:
  5.             result.insert(0, n%10)
  6.             get_digits(n//10)
  7.     else:
  8.         print("调用全局变量result",result)
  9.         print("调用局部变量result1",result1)

  10. get_digits(12345)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-3 04:26:41 | 显示全部楼层
Stubborn 发表于 2019-1-2 23:33
函数可以调用全局变量啊。这里的是全局变量。不是局部变量。自身调用自身的函数就叫递归函数,,在python中1 ...

你好,谢谢你的回答。递归那个我明白了,关于全局变量,我的意思不是函数不能调用全局变量,而是上述代码中是要不断向result的那个list里面加东西的,也就是需要在函数内对全局变量进行修改。但似乎应该只能在函数内部修改,而不会印象到函数作用域外的全局变量。如下代码:
  1. price = 90
  2. def ChangePrice():
  3.     price = 88
  4.     print('函数内修改后的价格:',price)
  5. print('最终的价格:',price)
复制代码

这段代码表示在函数内修改的price不会影响到外部的全局变量。所以对于问题中的那段代码,result在最后输出的时候是在函数体之外,道理来说不是应该是空列表吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 06:45:07 | 显示全部楼层
本帖最后由 Stubborn 于 2019-1-3 06:46 编辑
  1. price = 90
  2. def ChangePrice():
  3.     price = 88   #相同名字的局部变量,这个不叫全局变量,这里是定义一个变量,你在上面最开始是调用一个变量,需要修改可以声明,需要修改,添加关键字global 声明在修改全局变量,前面教程有交啊,没看吗?
  4.     print('函数内修改后的价格:',price)
  5. print('最终的价格:',price)
复制代码

  1. >>> def ChangePrice():
  2.     global price
  3.     price = 88
  4.     print('函数内修改后的价格:',price)

  5.    
  6. >>> price = 90
  7. >>> price
  8. 90
  9. >>> ChangePrice()
  10. 函数内修改后的价格: 88
  11. >>> price
  12. 88
  13. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 07:55:19 From FishC Mobile | 显示全部楼层
一个是列表,你对列表进行append,pop等操作都是修改列表本身,而下面给的是一个简单的整型变量,你重新赋值,并不是修改,而是新建,覆盖了原来的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 09:21:41 | 显示全部楼层    本楼为最佳答案   
  1. price = 90
  2. def ChangePrice():
  3.     price = 88//[color=Red]这个语句有歧义:1、可以是创建局部变量。2、修改全局变量。所以默认为创建局部变量[/color]
  4.     print('函数内修改后的价格:',price)
  5. print('最终的价格:',price)
复制代码
  1. result = []
  2. def get_digits(n):
  3.         if n > 0:
  4.                 result.insert(0, n%10)//[color=Red]这个语句非常明确,就是修改全局变量。如果你把这个改成result = [];result.insert(0, n%10);那么result就是局部变量,因为他是有歧义的,默认创建局部变量[/color]
  5.                 get_digits(n//10)

  6. get_digits(12345)
  7. print(result)
复制代码

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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