鱼C论坛

 找回密码
 立即注册
查看: 1236|回复: 2

[已解决]求助帖函数与数列的访问问题

[复制链接]
发表于 2020-9-12 21:57:49 | 显示全部楼层 |阅读模式

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

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

x
def a(x,y):
    x1=x.pop()
    y.append(x1)

x=[1,2,3]
y=[]

print('函数调用前:x=',x,';y=',y)
a(x,y)
print('函数调用后:x=',x,';y=',y)
def a(x,y):
    y=x
    x=[]
    
x=[1,2,3]
y=[]

print('函数调用前:x=',x,';y=',y)
a(x,y)
print('函数调用后:x=',x,';y=',y)

上述两段程序都算是修改列表内容,但是第一个程序在调用函数之后函数外的列表也产生了变化,但是第二段列表在调用函数之后列表依旧为产生变化。两段程序内函数体其实是都已针对于列表进行了操作。为什么会出现这样的差异。求高手指点。。。。
最佳答案
2020-9-12 22:09:01
本帖最后由 sunrise085 于 2020-9-12 22:11 编辑

因为第一段程序中,是修改的可变类型对象list;第二段程序中是定义的可变类型对象list
在函数中直接修改可变类型对象,不需要用global指出是全局变量,但是在函数中若重新定义可变类型对象,则需要用global指出是全局变量,否则就是局部变量。你可以在函数内外分别加上print(id(x),id(y))看看
可以看看我这个帖子(Python细节之7、global与nonlocal的使用)的第四部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-12 22:09:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-9-12 22:11 编辑

因为第一段程序中,是修改的可变类型对象list;第二段程序中是定义的可变类型对象list
在函数中直接修改可变类型对象,不需要用global指出是全局变量,但是在函数中若重新定义可变类型对象,则需要用global指出是全局变量,否则就是局部变量。你可以在函数内外分别加上print(id(x),id(y))看看
可以看看我这个帖子(Python细节之7、global与nonlocal的使用)的第四部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 22:09:53 | 显示全部楼层
按你第二段的意思,只需要一个参数,而且没有return值,所以你感觉没有变化
def a(x):
    y = x
    x = []
    return x,y

x = [1, 2, 3]
y = []

print('函数调用前:x=', x, ';y=', y)
x,y=a(x)
print('函数调用后:x=', x, ';y=', y)

第一段的函数是直接作用在函数上的,所以不需要return就可以产生变化了,第二段是变量重新赋值,但是没有return的话,只在局部范围作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-12 22:14:00 | 显示全部楼层
本帖最后由 假面的假面 于 2020-9-12 22:15 编辑

感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-12 22:28:02 | 显示全部楼层

如果问题解决了,就设个最佳吧,把求助帖关了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 17:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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