2 回答

TA贡献1828条经验 获得超3个赞
问题1
同时有效地声明它们。如果要基于另一个值来设置一个值,则不应使用单行声明。
演示:
>>> x,y = 1,x+2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> x,y = 1,y+2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
问题2
通常,您应该优先考虑可读性而不是优雅,但是要回答您的问题,还有另一种方法可以完成您想做的事情。
请注意,此语法lists = [1->2->3, 2->3->1, 0->9]无效,因此我改为这样做:lists = [ListNode(1),ListNode(2),ListNod(3)]
from operator import attrgetter
min(nodes, key=attrgetter('val'))
这将返回具有最低val的ListNode。您可以调用.val它来获取值本身。

TA贡献1796条经验 获得超10个赞
关于您的第一个问题,作业既可以一次执行,也可以从左至右执行。从Python的角度以及您无权访问的环境中,您可以立即从左至右访问引擎盖下的字节码级别。您可以使用dis模块进行检查。
In [1]: x,y = 1,2
In [2]: import dis
In [3]: dis.dis('x,y = 1,2')
1 0 LOAD_CONST 3 ((1, 2))
3 UNPACK_SEQUENCE 2
6 STORE_NAME 0 (x)
9 STORE_NAME 1 (y)
12 LOAD_CONST 2 (None)
15 RETURN_VALUE
如您所见,首先在偏移量6x处定义变量,然后在偏移量9处定义y。但是请注意,这并不意味着您可以在同一块中访问新的分配。就是说,在像这样y, x = 9, y+1 的代码中,yis的值是它在赋值之前的值(如果已经声明)。出现这种现象的原因是,您在反汇编的字节码中看到的是在后台而不是在Python级别上发生的事情,并且从您的角度来看,整个字节码将被立即评估。
关于第二个问题,您可以在min()函数内使用生成器表达式:
min(lst.val for lst in lists)
如果要返回Node对象,可以将其operator.attrgetter()用作key函数。
min(lists, key=attrgetter('val'))
添加回答
举报