鱼C论坛

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

关于两段代码区别的原理讲解(容器?)

[复制链接]
发表于 2017-1-16 19:11:22 | 显示全部楼层 |阅读模式
5鱼币
两段代码,分别是列表和字符串的区别,
第一段列表放在函数里面的话得到的结果为空,作为全局才能正确。
第二段字符串放在全局则报错。
不知道是不是容器类型的原因,希望有理解的同学帮我解答,谢谢!

  1. def get_digits(n):

  2.     list1 = []
  3.     if n == 0:
  4.         return list1
  5.     else:
  6.         list1.insert(0, n%10)
  7.         return get_digits(n//10)

  8. #list1 = []

  9. number = int(input('请输入一个数字:'))
  10. print(get_digits(number))
复制代码

  1. def Mybin(x):
  2.    
  3.     result = ''
  4.    
  5.     if x == 0:
  6.         return result
  7.     else:
  8.         result = str(x%2)
  9.         return  Mybin(x // 2) + result

  10. number = int(input('请输入一个要转换的十进制数字:'))
  11. print(Mybin(number))
复制代码

最佳答案

查看完整内容

其实跟是不是list、是不是字符串一点关系没有。 第一个程序:第一次执行函数,创建list内部变量,如果n!=0,执行到return get_digits(n//10),第一次的执行完全结束,list释放。开始执行get_digits(n//10),再次创建list内部变量直到结束。所以最后返回的list就是空 第二个程序:第一次执行后,到return Mybin(x // 2) + result,会等待 Mybin(x // 2)的返回结果,程序并没有结束,第二次执行会等待第三次返回的结果。。。。其 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-16 19:11:23 | 显示全部楼层
本帖最后由 小Q学Python 于 2017-1-17 13:30 编辑

其实跟是不是list、是不是字符串一点关系没有。
第一个程序:第一次执行函数,创建list内部变量,如果n!=0,执行到return get_digits(n//10),第一次的执行完全结束,list释放。开始执行get_digits(n//10),再次创建list内部变量直到结束。所以最后返回的list就是空
第二个程序:第一次执行后,到return  Mybin(x // 2) + result,会等待 Mybin(x // 2)的返回结果,程序并没有结束,第二次执行会等待第三次返回的结果。。。。其实就是递归啦。

第一个可以这么改一下:
  1. def get_digits(n):
  2.     list1 = []
  3.     if n == 0:
  4.         return list1
  5.     else:
  6.         return get_digits(n//10) + [n % 10]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-17 11:40:39 | 显示全部楼层
“python中,对象分为可变(mutable)和不可变(immutable)两种类型,元组(tuple)、数值型(number)、字符串(string)均为不可变对象,而字典型(dictionary)和列表型(list)的对象是可变对象”。修改可变对象的时候,例如list.append()、del dict[key],变量的内存地址依然与修改之前保持一致。而修改不可变对象时,例如a = 1; a += 1, str = 'hello'; str = 'world',相当于变量指向了另一个对象,因此修改前后,其内存地址发生了更改。

对于第二个小程序,如果z字符串作为全局变量,在函数中会把全局变量的result隐藏,而函数中调用result会发现指定有没定义过,所以会报错

而对于第一个小程序,list1不会改变地址,所以每次return get_digits(n//10) 的时候list1就会被重新复制为空,所以最后返回空

个人理解,如果有不同的意见希望指正
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-17 19:02:08 | 显示全部楼层
小茗同学 发表于 2017-1-17 11:40
“python中,对象分为可变(mutable)和不可变(immutable)两种类型,元组(tuple)、数值型(number)、 ...

谢谢您的耐心回答~  有个回答好像更说明了问题所在,您也可以看看哦~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-17 19:04:01 | 显示全部楼层
小Q学Python 发表于 2017-1-16 19:11
其实跟是不是list、是不是字符串一点关系没有。
第一个程序:第一次执行函数,创建list内部变量,如果n!= ...

感谢您的回答!另外想接着问您一下结合您说的怎么理解下面代码中的 “只要a变量没有被重新赋值,funX()就没有被释放,局部变量x就没有被重新初始化呢?”
  1. def funX():
  2.     x = 5
  3.     def funY():
  4.         nonlocal x
  5.         x += 1
  6.         return x
  7.     return funY

  8. a = funX()
  9. print(a())
  10. print(a())
  11. print(a())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-18 10:14:42 | 显示全部楼层
502883520 发表于 2017-1-17 19:02
谢谢您的耐心回答~  有个回答好像更说明了问题所在,您也可以看看哦~

学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 15:16:47 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-25 00:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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