自定义Server类两种makeOrder实现方法的差异咨询
直接创建列表与先空列表再追加的差异及代码报错原因
我不清楚以下两段Python代码的差异,提交到评分系统时我的代码被判错误,想知道直接创建包含值的列表和先创建空列表再追加元素这两种写法的区别。
我的代码:
class Server: def __init__(self): self.list = [] def makeOrder(self,orderNum, orderList): existance = False for order in self.list: if order[0]==orderNum: existance = True if existance == True: return -1 else: self.list.append([orderNum,orderList]) return [orderNum,orderList]
参考答案代码:
class Server: def __init__(self): self.q = [] # 1 def makeOrder(self, orderNumber, orderList): existAlready = False for order in self.q: if order[0] == orderNumber: existAlready = True if existAlready == True: return -1 else: tmp = [] tmp.append(orderNumber) tmp.append(orderList) self.q.append(tmp) return tmp
核心差异分析:
首先明确:直接创建列表[a, b]和先创建空列表再追加两次的写法,生成的列表内容完全一致,这两种方式本身没有功能上的区别。
你的代码被判错误的真正原因不在列表创建方式,而在返回值的对象身份:
- 你的代码中,添加到
self.list的是一个新列表[orderNum, orderList],但返回的是另一个全新创建的[orderNum, orderList]——这两个列表内容相同,但内存中是两个独立的对象。 - 参考答案中,先创建
tmp列表,把它添加到self.q后,直接返回同一个tmp对象——也就是存储在服务器队列里的那个列表实例。
如果评分系统的测试用例通过对象身份(比如Python的is运算符)验证返回值与服务器存储的订单是否为同一个实例,你的代码就会失败,因为返回的是不同对象,而参考答案返回的是同一个。
另外还有一个小细节:你使用了Python内置类型名称list作为实例变量名,虽然语法合法,但属于不规范写法,容易引发后续代码混淆(比如误将self.list当作内置list()函数调用),参考答案用q作为变量名更合理。
内容的提问来源于stack exchange,提问作者user18963342
相关产品推荐
相关产品推荐

