鱼C论坛

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

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

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

get_digits(12345)
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]

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


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


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

使用道具 举报

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

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

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

使用道具 举报

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

函数内屏蔽一个全局变量的前提:
函数内部也创建了一个相同的局部变量,就会屏蔽掉外部的全局变量,所以这里加了一行:
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 编辑


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

来目测一下,不上机前提,测试下答案
def cre():
    return [lambda x: x * i for i in range(5)]

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


def fun(val=[]):
    val.append(2)
    return val
fun()
fun(val=[])
print(fun())

lista = [[]] * 10
lista[0].append(10)
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-6-18 11:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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