关于Python列表实现队列中enqueue函数的两项技术疑问
Python列表实现队列中enqueue函数的疑问解答
首先来看你给出的队列实现代码:
def enqueue(queue, item): queue = queue.append(item) #print(queue) def dequeue(queue): return queue.pop(0) def isEmpty(queue): return len(queue)==0 def createQueue(): return []
针对你围绕enqueue()函数的两个疑问,我来逐一解释:
疑问1:语句中的queue =有何作用?既然list.append()无返回值,为何不省略该赋值操作?
这个queue =完全是多余且错误的写法!
list.append()是一个原地修改列表的方法——它会直接把元素添加到你传入的列表里,而不会返回任何新的列表(返回值固定为None)。你这里把append的返回值(也就是None)赋值给局部变量queue,不仅没有任何实际作用,反而会让这个局部变量和原本传入的队列列表断开引用关系。
正确的写法应该直接去掉赋值,只保留:
def enqueue(queue, item): queue.append(item)
这样就足够了,因为列表是可变对象,函数内调用append会直接修改外部传入的那个列表本身,不需要额外赋值。
疑问2:为何queue = queue.append(item)不会将传入的原队列改为None,仅修改局部变量queue?
这要结合Python的变量引用机制来理解:
- 当你把列表传给
enqueue函数时,函数内部的局部变量queue一开始是指向原列表对象的引用——这时候它和外部的队列变量指向同一个内存里的列表。 - 执行
queue.append(item)时,是通过这个引用修改了原列表对象本身(所以外部的队列确实会被添加元素); - 但紧接着的
queue = ...是把append返回的None赋值给了这个局部变量queue——这一步只是让函数内部的这个局部变量不再指向原列表,转而指向None,但这只是函数内部的局部变量变化,完全不会影响外部的原列表对象,也不会改变外部变量的指向。
你可以做个简单测试验证:
q = createQueue() enqueue(q, "hello") print(q) # 输出 ['hello'],原队列确实被修改了
虽然函数内部的queue变量变成了None,但外部的q依然指向原本的列表,而且已经被append操作修改了。
内容的提问来源于stack exchange,提问作者yot
相关产品推荐
相关产品推荐

