rplt 发表于 2021-10-7 16:43:16

关于函数中列表的问题,各位大哥教教小弟

本帖最后由 rplt 于 2021-10-7 18:55 编辑



def main():
    ist=
    Reverse(ist)
    for i in ist:
      print(i,end=' ')


def Reverse(ist):
    newlist=*len(ist)
    for i in range(len(ist)):
      newlist=ist

    ist=newlist

main()


小弟的理解是,经过ist=newlist之后      ist与newlist 都同时指向了      列表是可以通过函数改变的吧,那在main函数里输出ist的时候也应该是


但在PYTHON3 上输出的是

kogawananari 发表于 2021-10-7 16:45:47

def main():
    ist=
    Reverse(ist)
    for i in ist:
      print(i,end=' ')


def Reverse(ist):
    newlist=*len(ist)
    for i in range(len(ist)):
      newlist=ist
    ist[:]=newlist

main()

傻眼貓咪 发表于 2021-10-7 18:18:28

你的代码牵连局部变量问题,跟列表指向地址无关,不同函数内部也就不同局部(变量可以用相同名字,但完全不同地址,除非在函数外面定义全局变量!)
def main():
    arr =
    def reverse():
      nonlocal arr
      arr = arr[::-1]
    reverse()
    print(*arr)

main()

rplt 发表于 2021-10-7 18:57:42

傻眼貓咪 发表于 2021-10-7 18:18
你的代码牵连局部变量问题,跟列表指向地址无关,不同函数内部也就不同局部(变量可以用相同名字,但完全不 ...

哥你的意思是,这个在函数里创建的newlist只是个局部变量,函数结束后就消失了,所以输出的还是【1,2,3,4,5】是吧?

rplt 发表于 2021-10-7 18:58:37

kogawananari 发表于 2021-10-7 16:45
def main():
    ist=
    Reverse(ist)


哥 这个是书上的,我就想知道 为什么不会输出

kogawananari 发表于 2021-10-7 19:26:53

rplt 发表于 2021-10-7 18:58
哥 这个是书上的,我就想知道 为什么不会输出

我不知道你说的什么书 我只是给你改成符合你预期的样子了

kogawananari 发表于 2021-10-7 19:29:56

kogawananari 发表于 2021-10-7 19:26
我不知道你说的什么书 我只是给你改成符合你预期的样子了

列表是可以通过函数改变的 这是对的
但是ist=newlist没有修改列表
切片赋值才是修改列表

傻眼貓咪 发表于 2021-10-7 19:53:08

本帖最后由 傻眼貓咪 于 2021-10-7 19:59 编辑

rplt 发表于 2021-10-7 18:57
哥你的意思是,这个在函数里创建的newlist只是个局部变量,函数结束后就消失了,所以输出的还是【1,2,3 ...

你的代码:ist 和 newlist 都是局部变量
函数 Reverse() 中的参数 ist 只取 ist 的值,不是 ist 地址,所以 main() 和 Reverse() 里面的 ist 列表名字虽然一样,但是地址完全不一样

你想用函数改变列表值如:arr = # 这是全局变量(因为在函数外面)

def main():
    arr.append(13) # 因为 arr 已经定义全局变量了,所以这里 arr 就是全局变量

main()

print(arr)

rplt 发表于 2021-10-7 21:22:14

kogawananari 发表于 2021-10-7 19:29
列表是可以通过函数改变的 这是对的
但是ist=newlist没有修改列表
切片赋值才是修改列表

懂了谢谢哥

rplt 发表于 2021-10-7 21:23:58

傻眼貓咪 发表于 2021-10-7 19:53
你的代码:ist 和 newlist 都是局部变量
函数 Reverse() 中的参数 ist 只取 ist 的值,不是 ist 地址 ...

{:5_100:}悟了悟了,也就是这个程序最终输出的只是main函数的ist,所以输出结果是,而不是输出的是Reverse里的ist.

Stubborn 发表于 2021-10-7 23:25:04

本帖最后由 Stubborn 于 2021-10-7 23:29 编辑

你理解错误的一点
在Reverse函数中,ist变量只是一个“标签”,这个标签告诉派森,我是“贴”在什么数据上面的。
如果你需要改里面的数据,应该是通过这边标签去找数据。比如你直接对ist变量操作,是可以影响到mian函数传递的列表。
而不是把这个“标签”贴到其他的数据上:ist=newlist

这个是Reverse函数运行ist=newlist操作前的内存分布


这个是Reverse函数运行ist=newlist操作后的内存分布


你可以很明显的看到,在运行前,ist标签还是指向mian函数的列表空间,但是执行后就没有了,因为你把ist标签重新“贴地方”了

rplt 发表于 2021-10-12 15:18:13

Stubborn 发表于 2021-10-7 23:25
你理解错误的一点
在Reverse函数中,ist变量只是一个“标签”,这个标签告诉派森,我是“贴”在什么数据上 ...

感谢大哥的解答 讲透了{:10_250:}
页: [1]
查看完整版本: 关于函数中列表的问题,各位大哥教教小弟