python中情况下值传递为空_python中的赋值 值传递?

几行很简单的代码

def func(m):

m[0] = 10

m = [100,200,300]

return m

m = [1,2,3]

func(m)

print(m)

猜测这个输出是什么呢?

A.【1,2,3】

B.【10,2,3】

C.【100,200,300】

乍一看,我还以为是选C,m不是被重新赋值了吗!but,运行后,证明我是错的

控制台输出的是B

为什么是B呢?

我加几行代码帮助理解

def func(m):

print(id(m))

m[0] = 10

print(id(m))

m = [100,200,300]

print(id(m))

return m

m = [1,2,3]

print(id(m))

func(m)

print(m)

执行代码,输出如下

36446536

36446536

36446536

36552392

[10, 2, 3]

在第一个和第二个print可以表明传递进来的对象是同一个36446536,经过赋值m[0]=10后,对象还是36446536,

在第四个print表明,此时的m已经不是传进来的那个“m”了

这个情况呢,用内存模型的角度来解释,就很好理解

1.先定义m=[1,2,3],有一个栈变量m和堆【1,2,3】,栈变量m指向堆【1,2,3】

2.调用func(m),则在栈里,多一个“伪m”也指向堆【1,2,3】

3.执行m=[100,200,300],则“伪m”修改指向伪堆【100,200,300】

但是呢,这样理解是不对的,因为python里只有值传递,按照上述内存模型的方式理解,则变成了引用传递了,but,如果按照值传递的思路,那如何解释前两次print(id)都是同一个36446536呢?

引用官方的原话:

Remember that arguments are passed by assignment in Python.

要记住,Python 里的参数是通过赋值传递的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值