Python bisect.insort操作不同对象的行为差异技术问询
为什么bisect.insort的行为在两种场景下不同?
这其实是Python中可变类型vs不可变类型以及bisect.insort工作机制的问题,我来一步步拆解清楚:
第一个场景:test是整数(不可变类型)
先还原你完整的代码逻辑(应该是漏写了第二次print,否则输出不会有两个1):
import bisect test = 1 print(test) bisect.insort([test], 6) print(test)
这里的关键细节:
[test]是临时创建了一个全新的列表,内容是[1],但这个列表没有被赋值给任何变量,相当于“用完就扔”bisect.insort确实把6插入到了这个临时列表里,但因为没人“保留”这个临时列表,它执行完就被Python自动回收了- 而原来的
test是整数,属于不可变类型——你只是用test的数值创建了新列表,根本没把test本身传给insort,所以test的值从头到尾都没变化 - 最终两次打印的都是最初的
test值1
第二个场景:test是列表(可变类型)
再看这段代码:
import bisect test = [1] print(test) bisect.insort(test, 6) print(test)
这里的逻辑完全不同:
test本身就是一个列表对象,你直接把这个对象的引用传给了bisect.insortbisect.insort的设计就是直接修改传入的列表本身(因为列表是可变类型,可以在原对象上修改内容,不需要创建新对象)- 执行
insort后,test指向的那个列表被直接修改成了[1,6],所以第二次打印能看到变化
核心总结
- 传
[test]时,你传递的是临时生成的新列表,原变量test完全不受影响 - 传
test(且它是列表)时,你传递的是列表对象本身的引用,insort会直接修改这个对象的内容
内容的提问来源于stack exchange,提问作者Mr. Meeseeks
相关产品推荐
相关产品推荐

