Python中.pop()方法在表达式组合时的行为差异原因
为什么Python列表链式调用
.pop()后结果不符合预期? 嘿,这个问题的核心是你没搞清楚pop()方法的返回值特性,咱们一步步拆解来看:
第一种写法(符合预期)
先看你能得到正确结果的代码:
input_data = open('day_3_input.txt', 'r').read() instructions = input_data.split('\n') instructions.pop() print(len(instructions)) # 输出2
这里的执行逻辑是:
input_data.split('\n')生成一个长度为3的列表,把这个完整列表赋值给instructions。- 调用
instructions.pop()时,这个方法会直接修改instructions本身——移除列表的最后一个元素,同时返回被移除的元素(但你没接收这个返回值,不影响)。 - 此时
instructions还是那个列表,只是少了最后一个元素,所以长度是2,打印结果符合预期。
第二种写法(出现异常)
再看让你困惑的代码:
input_data = open('day_3_input.txt', 'r').read() instructions = input_data.split('\n').pop() print(len(instructions)) # 输出0
这里的问题出在链式调用的返回值上:
input_data.split('\n')同样生成了长度为3的列表,但你没有把这个列表存下来,而是立刻调用了.pop()。- 重点:
pop()方法返回的是被移除的元素,而不是修改后的列表! 所以这里instructions被赋值的是原列表最后一个元素(根据你的输出,这个元素是空字符串'',应该是文件末尾的换行符导致split出来最后一项为空)。 - 你打印的
len(instructions)其实是在计算这个空字符串的长度,自然就是0了。
小技巧:替代链式调用的写法
如果你想一步得到移除最后一个元素的列表,可以用切片操作,比pop更直观:
instructions = input_data.split('\n')[:-1] print(len(instructions)) # 输出2
切片[:-1]会直接取到原列表除最后一个元素外的所有项,返回的就是你想要的缩短后的列表。
内容的提问来源于stack exchange,提问作者StrawhatLuffy
相关产品推荐
相关产品推荐

