whj1566 发表于 2022-3-2 16:55:09

求助大神:不应该result一直为0吗

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

get_digits(12345)
print(result)


result不是被屏蔽了吗,怎么还能打印出

isdkz 发表于 2022-3-2 16:55:10

在小的命名空间(局部)中只是不能改变大的命名空间(全局)的变量的指向(地址)而已,

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

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

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

大马强 发表于 2022-3-2 17:03:12

你为啥觉得reslut被屏蔽了?

大马强 发表于 2022-3-2 17:05:10

result 是全局变量

whj1566 发表于 2022-3-2 17:08:30

函数中运行的result值,是与函数外面中的result同名不同ID值变量,函数里不管怎么运算,觉得外面应该一直是[]啊

python爱好者. 发表于 2022-3-2 17:37:21

好像是应该屏蔽的...{:10_324:}

大马强 发表于 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



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)

python爱好者. 发表于 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)

python爱好者. 发表于 2022-3-2 17:42:35

python爱好者. 发表于 2022-3-2 17:39
这样就能屏蔽了:

函数内屏蔽一个全局变量的前提:
函数内部也创建了一个相同的局部变量,就会屏蔽掉外部的全局变量,所以这里加了一行:
result = []
就能让函数内部屏蔽掉外部的 result 了,而是采用内部的局部变量 result!

python爱好者. 发表于 2022-3-2 17:43:55

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

否则就能引用全局变量

Stubborn 发表于 2022-3-2 19:08:05

本帖最后由 Stubborn 于 2022-3-2 19:14 编辑

python爱好者. 发表于 2022-3-2 17:39
这样就能屏蔽了:

在递归中,你这样写代码,是要被打的{:10_285:}

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

def cre():
    return

print(cre()(2))


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

lista = [[]] * 10
lista.append(10)
print(lista[-1])

python爱好者. 发表于 2022-3-2 19:25:41

Stubborn 发表于 2022-3-2 19:08
在递归中,你这样写代码,是要被打的

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

刚才没看到


[]

python爱好者. 发表于 2022-3-2 19:31:55

python爱好者. 发表于 2022-3-2 19:25
刚才没看到




8


???怎么会这样
话说我那样写为什么会挨打?{:10_277:}

python爱好者. 发表于 2022-3-2 19:38:52

python爱好者. 发表于 2022-3-2 19:31
8




哦~懂了,
但为什么那段代码会让我挨打?{:10_277:}
是局部变量和外部变量冲突了,让人看不顺眼,接着就会被打吗?{:10_334:}

Stubborn 发表于 2022-3-2 19:41:31

python爱好者. 发表于 2022-3-2 19:31
8




递归中,每次都新建一个局部的result变量,最终需要的结果,你从哪里来?

python爱好者. 发表于 2022-3-2 20:03:47

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

好像是该打{:10_285:}
页: [1]
查看完整版本: 求助大神:不应该result一直为0吗