Python中copy()与remove(i)同写一行失效、拆分两行正常的原因咨询
两个程序输出不同的核心原因
这是Python列表remove()方法的返回值特性导致的:所有直接修改列表本身的内置方法(包括remove()/append()/sort()/reverse()等),都没有返回值,默认返回None。
程序1的执行逻辑
- 代码中
x.copy().remove(i)的执行顺序是:- 先执行
x.copy()生成一个x的副本临时列表 - 直接在这个临时列表上调用
remove(i)方法,方法执行后会修改临时列表的内容,但返回值为None - 你把
remove()的返回值None赋值给了temp,所以最终打印的全是None
- 先执行
- 那个被修改过的临时列表因为没有被任何变量引用,执行完就被系统回收了,你无法拿到它的内容。
程序2的执行逻辑
- 你先把
x.copy()生成的新列表赋值给temp变量,temp持有这个新列表的引用 - 再调用
temp.remove(i),虽然这个方法依旧返回None,但你没有用它的返回值覆盖temp,而是直接修改了temp指向的列表本身的内容 - 最终打印temp的时候,输出的就是修改后的列表,符合预期。
单行实现相同逻辑的方案(Python 3.8+支持海象运算符的场景下)
for i in d: (temp := x.copy()).remove(i) print(temp)
该写法可以得到和程序2完全一致的输出。
内容的提问来源于stack exchange,提问作者huzy
相关产品推荐
相关产品推荐

