本人初学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
, 为什么?
问题更新了一下, 望有前辈能解答, 不胜感激!
你的理解是对的。
这一部分没有看懂什么意思
a.extend(b)
肯定是先计算 a,因为.
操作符的结合性是自左向右的,所以在解析这个表达式的时候,先计算 a,然后计算 extend,发现这是个函数调用,才计算函数的参数