找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 6372|回复: 5

[已解决] python的函数中参数的传递方式

1

主题

3

帖子

3

积分

贫民

积分
3
elancn 发表于 2016-9-25 16:55:49 | 显示全部楼层 |阅读模式
各位大神,看了一些资料,大致理解python的函数中,参数分为静态变量和动态变量。
当动态变量做为参数时,是按照引用的方式传递的函数中,如下所示:
  1. def changeLst(a):
  2.     a[0]=10

  3. lstFoo=[2]

  4. changeLst(lstFoo)
  5. print(lstFoo)
复制代码
但是如下的代码却没有改变列表的值,就有点犯疑问了,请大神赐教!
  1. def f(lst):
  2.     lst=[4,5,6]

  3. lst=[1,2,3]

  4. f(lst)
  5. print(lst)
复制代码
这段代码为什么没有在函数中改变lst的值?



回复

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-9-25 21:29:25 | 显示全部楼层
本帖最后由 whydo1 于 2016-9-25 21:30 编辑

python的变量和其它语言的变量略有不同.
每次赋值的时候实际上都会创建"新"的变量.
比如 a=3, 是这样一个过程: 先在内存中找到一个空间放入3这个数,然后把a指向这个内存地址.
如果接下来执行a=4,就会在内存中再找到一个新的空间放入4这个数,然后把a重新指向这个新的内存地址
你可以想象变量名是一个标签,而内存地址是一个个的空的或是非空的箱子,给变量赋值的过程,实际上是把变量名标签粘贴到新的箱子上的过程.

所以上面第一个程序中你传递了变量的地址,然后对地址中的值进行修改,结果是正确的.
第二个程序中,你传递了变量的地址,然后你重新建立了一个新的变量,这个新变量的地址和原来的地址是不同的,实际上是建立了一个局部变量.

如果确实要实现第二个程序的功能,可以使用全局变量.

  1. global lst2
  2. def f2():
  3.     global lst2
  4.     lst2=[4,5,6]

  5. f2()
  6. print('全局列表:', lst2)
复制代码

回复 支持 2 反对 0

使用道具 举报

0

主题

12

帖子

12

积分

贫民

积分
12
tt_koma 发表于 2016-9-25 22:29:58 | 显示全部楼层
def changeLst(a):
    a[0]=10
    print id(a)

lstFoo=[2]
print id(lstFoo)
changeLst(lstFoo)
print(lstFoo)

def f(lst):
    lst=[4,5,6]
    print id(lst)

lst=[1,2,3]
print id(lst)
f(lst)
print(lst)

楼上描述的很正确,python对变量的处理的确有些与其他语言不同的地方,可以使用id()来查看所操作的对象是否为同一个

回复 支持 反对

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
elancn  楼主| 发表于 2016-10-13 22:47:42 | 显示全部楼层
whydo1 发表于 2016-9-25 21:29
python的变量和其它语言的变量略有不同.
每次赋值的时候实际上都会创建"新"的变量.
比如 a=3, 是这样一个 ...

抱歉,大神,起那段时间忙去了。没回来看!谢谢你的点评
回复 支持 反对

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
elancn  楼主| 发表于 2016-10-13 22:48:15 | 显示全部楼层
tt_koma 发表于 2016-9-25 22:29
def changeLst(a):
    a[0]=10
    print id(a)

谢谢大神的指导,指导了id函数~~
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-14 20:51:35 | 显示全部楼层
elancn 发表于 2016-10-13 22:47
抱歉,大神,起那段时间忙去了。没回来看!谢谢你的点评

呵呵.我不是大神. 大家一起交流.
回复 支持 反对

使用道具 举报

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

本版积分规则

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