鱼C论坛

 找回密码
 立即注册
查看: 1693|回复: 15

[已解决]求助大神:不应该result一直为0吗

[复制链接]
发表于 2022-3-2 16:55:09 | 显示全部楼层 |阅读模式
10鱼币
  1. result = []
  2. def get_digits(n):
  3.         if n > 0:
  4.                 result.insert(0, n%10)
  5.                 get_digits(n//10)

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


result不是被屏蔽了吗,怎么还能打印出[1, 2, 3, 4, 5]
最佳答案
2022-3-2 16:55:10
在小的命名空间(局部)中只是不能改变大的命名空间(全局)的变量的指向(地址)而已,

还是可以获取到大的命名空间的指向(地址)的(只要没有在函数内重新声明一个跟全局变量同名的局部变量),

而列表是可变对象,可以直接原地操作的,append 并不会改变列表变量的指向(地址),

所以可以直接对全局的列表造成影响

最佳答案

查看完整内容

在小的命名空间(局部)中只是不能改变大的命名空间(全局)的变量的指向(地址)而已, 还是可以获取到大的命名空间的指向(地址)的(只要没有在函数内重新声明一个跟全局变量同名的局部变量), 而列表是可变对象,可以直接原地操作的,append 并不会改变列表变量的指向(地址), 所以可以直接对全局的列表造成影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 16:55:10 | 显示全部楼层    本楼为最佳答案   
在小的命名空间(局部)中只是不能改变大的命名空间(全局)的变量的指向(地址)而已,

还是可以获取到大的命名空间的指向(地址)的(只要没有在函数内重新声明一个跟全局变量同名的局部变量),

而列表是可变对象,可以直接原地操作的,append 并不会改变列表变量的指向(地址),

所以可以直接对全局的列表造成影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:03:12 | 显示全部楼层
你为啥觉得reslut被屏蔽了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:05:10 | 显示全部楼层
result 是全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-2 17:08:30 | 显示全部楼层
函数中运行的result值,是与函数外面中的result同名不同ID值变量,函数里不管怎么运算,觉得外面应该一直是[]啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:37:21 | 显示全部楼层
好像是应该屏蔽的...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:39:08 | 显示全部楼层
whj1566 发表于 2022-3-2 17:08
函数中运行的result值,是与函数外面中的result同名不同ID值变量,函数里不管怎么运算,觉得外面应该一直是 ...

你又是咋知道外面和里面不一样的?
外面的result的id 2688494527168
里面的result的id 2688494527168
里面的result的id 2688494527168
里面的result的id 2688494527168
里面的result的id 2688494527168
里面的result的id 2688494527168
里面的result的id 2688494527168
[1, 2, 3, 4, 5]


  1. result = []
  2. print("外面的result的id", id(result))


  3. def get_digits(n):
  4.     if n > 0:
  5.         result.insert(0, n % 10)
  6.         get_digits(n//10)
  7.     print("里面的result的id", id(result))


  8. get_digits(12345)
  9. print(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:39:34 | 显示全部楼层
python爱好者. 发表于 2022-3-2 17:37
好像是应该屏蔽的...

这样就能屏蔽了:
  1. result = []
  2. def get_digits(n):
  3.     result = []
  4.     if n > 0:
  5.         result.insert(0, n%10)
  6.         get_digits(n//10)

  7. get_digits(12345)
  8. print(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:42:35 | 显示全部楼层

函数内屏蔽一个全局变量的前提:
函数内部也创建了一个相同的局部变量,就会屏蔽掉外部的全局变量,所以这里加了一行:
  1. result = []
复制代码

就能让函数内部屏蔽掉外部的 result 了,而是采用内部的局部变量 result!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 17:43:55 | 显示全部楼层
python爱好者. 发表于 2022-3-2 17:42
函数内屏蔽一个全局变量的前提:
函数内部也创建了一个相同的局部变量,就会屏蔽掉外部的全局变量,所以 ...

否则就能引用全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 19:08:05 | 显示全部楼层
本帖最后由 Stubborn 于 2022-3-2 19:14 编辑


在递归中,你这样写代码,是要被打的

来目测一下,不上机前提,测试下答案

  1. def cre():
  2.     return [lambda x: x * i for i in range(5)]

  3. print(cre()[0](2))


  4. def fun(val=[]):
  5.     val.append(2)
  6.     return val
  7. fun()
  8. fun(val=[])
  9. print(fun())

  10. lista = [[]] * 10
  11. lista[0].append(10)
  12. print(lista[-1])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 19:25:41 | 显示全部楼层
Stubborn 发表于 2022-3-2 19:08
在递归中,你这样写代码,是要被打的

来目测一下,不上机前提,测试下答案

刚才没看到
[0,2,4,6,8]
[2,2]
[]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 19:31:55 | 显示全部楼层
python爱好者. 发表于 2022-3-2 19:25
刚才没看到
[0,2,4,6,8]
[2,2]

8
[2,2]
[10]
???怎么会这样
话说我那样写为什么会挨打?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 19:38:52 | 显示全部楼层

哦~懂了,
但为什么那段代码会让我挨打?
是局部变量和外部变量冲突了,让人看不顺眼,接着就会被打吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 19:41:31 | 显示全部楼层

递归中,每次都新建一个局部的result变量,最终需要的结果,你从哪里来?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 20:03:47 | 显示全部楼层
Stubborn 发表于 2022-3-2 19:41
递归中,每次都新建一个局部的result变量,最终需要的结果,你从哪里来?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 09:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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