为了账号安全,请及时绑定邮箱和手机立即绑定

python 按引用传递的一个小问题

python 按引用传递的一个小问题

子衿沉夜 2018-12-09 19:38:17
本人初学python, 遇到了如下这么一段代码, 根据运行的结果思考了一下, 不知道理解对不对.版本为python3.6代码如下:def g(p):     z = p.pop(0)     p.extend(z)    return p y = ['h', 'i', 'j'] g(y).extend(g(y[:]))  print(y) # -> ['i', 'j', 'h', 'j', 'h', 'i']个人理解如下:首先运行g(y), 由于按引用传递(不知道这么表述对不对?), 该函数直接在y上面进行修改, 此时y变成了['i', 'j', 'h'].此时运行后面的.extend(g(y[:])). 首先拷贝一份y的数据, y此时没变, 然后进行g(y[:])操作, 该操作将y[:]变为['j', 'h', 'i']最后进行extend()操作, y和y[:]合并, 得到最后结果为['i', 'j', 'h', 'j', 'h', 'i']不知道上述理解是否有误, 恳请前辈指点一下, 不胜感激!同时刚刚在撰写问题的时候想到的另外一个问题:为什么不可以先运行g(y[:])部分? 如果先运行这一部分的话, 最后得到的结果应该是['i', 'j', 'h', 'i', 'j', 'h']. 但是解释器给的答案还是上面的, 所以对于这一问题疑惑概括为:如果有a.extend(b)那么是先运行a还是先运行b, 为什么?问题更新了一下, 望有前辈能解答, 不胜感激!
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

本人初学python, 遇到了如下这么一段代码, 根据运行的结果思考了一下, 不知道理解对不对.

版本为python3.6

代码如下:

def g(p):
    z = p.pop(0)
    p.extend(z)    return p

y = ['h', 'i', 'j']
g(y).extend(g(y[:])) 

print(y) # -> ['i', 'j', 'h', 'j', 'h', 'i']

个人理解如下:

  1. 首先运行g(y), 由于按引用传递(不知道这么表述对不对?), 该函数直接在y上面进行修改, 此时y变成了['i', 'j', 'h'].

  2. 此时运行后面的.extend(g(y[:])). 首先拷贝一份y的数据, y此时没变, 然后进行g(y[:])操作, 该操作将y[:]变为['j', 'h', 'i']

  3. 最后进行extend()操作, yy[:]合并, 得到最后结果为['i', 'j', 'h', 'j', 'h', 'i']

不知道上述理解是否有误, 恳请前辈指点一下, 不胜感激!

同时刚刚在撰写问题的时候想到的另外一个问题:

为什么不可以先运行g(y[:])部分? 如果先运行这一部分的话, 最后得到的结果应该是['i', 'j', 'h', 'i', 'j', 'h']. 但是解释器给的答案还是上面的, 所以对于这一问题疑惑概括为:

如果有a.extend(b)那么是先运行a还是先运行b, 为什么?

问题更新了一下, 望有前辈能解答, 不胜感激!


查看完整回答
反对 回复 2018-12-09
  • 1 回答
  • 0 关注
  • 563 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信