鱼C论坛

 找回密码
 立即注册
查看: 1949|回复: 11

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

[复制链接]
发表于 2021-10-7 16:43:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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



def main():
    ist=[1,2,3,4,5]
    Reverse(ist)
    for i in ist:
        print(i,end=' ')


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

    ist=newlist

main()


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


但在PYTHON3 上输出的是[1,2,3,4,5]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-7 16:45:47 | 显示全部楼层
def main():
    ist=[1,2,3,4,5]
    Reverse(ist)
    for i in ist:
        print(i,end=' ')


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

main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 18:18:28 | 显示全部楼层
你的代码牵连局部变量问题,跟列表指向地址无关,不同函数内部也就不同局部(变量可以用相同名字,但完全不同地址,除非在函数外面定义全局变量!)
  1. def main():
  2.     arr = [1, 2, 3, 4, 5]
  3.     def reverse():
  4.         nonlocal arr
  5.         arr = arr[::-1]
  6.     reverse()
  7.     print(*arr)

  8. main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哥你的意思是,这个在函数里创建的newlist只是个局部变量,函数结束后就消失了,所以输出的还是【1,2,3,4,5】是吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 18:58:37 | 显示全部楼层
kogawananari 发表于 2021-10-7 16:45
def main():
    ist=[1,2,3,4,5]
    Reverse(ist)

哥 这个是书上的,我就想知道 为什么不会输出[1,2,3,4,5]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 19:26:53 | 显示全部楼层
rplt 发表于 2021-10-7 18:58
哥 这个是书上的,我就想知道 为什么不会输出[1,2,3,4,5]

我不知道你说的什么书 我只是给你改成符合你预期的样子了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 19:29:56 | 显示全部楼层
kogawananari 发表于 2021-10-7 19:26
我不知道你说的什么书 我只是给你改成符合你预期的样子了

列表是可以通过函数改变的 这是对的
但是ist=newlist没有修改列表
切片赋值才是修改列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 列表名字虽然一样,但是地址完全不一样

你想用函数改变列表值如:
  1. arr = [1, 2, 3, 4, 5] # 这是全局变量(因为在函数外面)

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

  4. main()

  5. print(arr)
复制代码
  1. [1, 2, 3, 4, 5, 13]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 21:22:14 | 显示全部楼层
kogawananari 发表于 2021-10-7 19:29
列表是可以通过函数改变的 这是对的
但是ist=newlist没有修改列表
切片赋值才是修改列表

懂了谢谢哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

悟了悟了,也就是这个程序最终输出的只是main函数的ist,所以输出结果是[1,2,3,4,5],而不是输出的是Reverse里的ist.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-7 23:25:04 | 显示全部楼层
本帖最后由 Stubborn 于 2021-10-7 23:29 编辑

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

这个是Reverse函数运行ist=newlist操作前的内存分布
微信截图_20211007232619.png

这个是Reverse函数运行ist=newlist操作后的内存分布
微信截图_20211007232634.png

你可以很明显的看到,在运行前,ist标签还是指向mian函数的列表空间,但是执行后就没有了,因为你把ist标签重新“贴地方”了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-12 15:18:13 | 显示全部楼层
Stubborn 发表于 2021-10-7 23:25
你理解错误的一点
在Reverse函数中,ist变量只是一个“标签”,这个标签告诉派森,我是“贴”在什么数据上 ...

感谢大哥的解答 讲透了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 01:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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