求助大神:不应该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不是被屏蔽了吗,怎么还能打印出 在小的命名空间(局部)中只是不能改变大的命名空间(全局)的变量的指向(地址)而已,
还是可以获取到大的命名空间的指向(地址)的(只要没有在函数内重新声明一个跟全局变量同名的局部变量),
而列表是可变对象,可以直接原地操作的,append 并不会改变列表变量的指向(地址),
所以可以直接对全局的列表造成影响 你为啥觉得reslut被屏蔽了?
result 是全局变量 函数中运行的result值,是与函数外面中的result同名不同ID值变量,函数里不管怎么运算,觉得外面应该一直是[]啊 好像是应该屏蔽的...{:10_324:} 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: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:39
这样就能屏蔽了:
函数内屏蔽一个全局变量的前提:
函数内部也创建了一个相同的局部变量,就会屏蔽掉外部的全局变量,所以这里加了一行:
result = []
就能让函数内部屏蔽掉外部的 result 了,而是采用内部的局部变量 result!
python爱好者. 发表于 2022-3-2 17:42
函数内屏蔽一个全局变量的前提:
函数内部也创建了一个相同的局部变量,就会屏蔽掉外部的全局变量,所以 ...
否则就能引用全局变量 本帖最后由 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]) Stubborn 发表于 2022-3-2 19:08
在递归中,你这样写代码,是要被打的
来目测一下,不上机前提,测试下答案
刚才没看到
[]
python爱好者. 发表于 2022-3-2 19:25
刚才没看到
8
???怎么会这样
话说我那样写为什么会挨打?{:10_277:} python爱好者. 发表于 2022-3-2 19:31
8
哦~懂了,
但为什么那段代码会让我挨打?{:10_277:}
是局部变量和外部变量冲突了,让人看不顺眼,接着就会被打吗?{:10_334:} python爱好者. 发表于 2022-3-2 19:31
8
递归中,每次都新建一个局部的result变量,最终需要的结果,你从哪里来? Stubborn 发表于 2022-3-2 19:41
递归中,每次都新建一个局部的result变量,最终需要的结果,你从哪里来?
好像是该打{:10_285:}
页:
[1]