python是如何做到的;“扔掉”;可变功?

python是如何做到的;“扔掉”;可变功?,python,Python,假设我有: [obj for (_, obj) in stack] 此代码假定堆栈中的第一个对象是元组,并丢弃元组的第一部分 如果代码不是元组,而是单个对象,会发生什么 它是否只是忽略被丢弃的部分并获取整个对象?否,它将引发异常 >>> _, obj = [0] ValueError: need more than 1 value to unpack 在这里使用只是一种惯例。它用于开发人员读取代码(“哦,他的意思是这个变量不会用于任何事情”)。但是对于解释器来说,它在这个上

假设我有:

[obj for (_, obj) in stack]
此代码假定
堆栈中的第一个对象是元组,并丢弃元组的第一部分

如果代码不是元组,而是单个对象,会发生什么


它是否只是忽略被丢弃的部分并获取整个对象?

否,它将引发异常

>>> _, obj = [0]
ValueError: need more than 1 value to unpack
在这里使用
只是一种惯例。它用于开发人员读取代码(“哦,他的意思是这个变量不会用于任何事情”)。但是对于解释器来说,它在这个上下文中没有任何意义,它也可能是任何其他标识符名称


如果代码不是元组,而是单个对象,会发生什么

这在python3中得到了改进,在python3中,您可以使用以下新选项:

>>> *_, obj = [0]
>>> _
[]
>>> obj
0

解包“最后一个”对象现在仍然有效,而不是引发异常,无论容器中是否有1、2或3+项

在for循环中使用的称为iterable解包,这意味着任何iterable都将解包为变量名:

a, b, c, ... = iterable
左侧变量的数量必须与右侧iterable中的项目相匹配

如果数字不相等,则引发ValueError;如果右侧不可编辑,则引发TypeError


在for循环中,您只使用第二个参数,根据约定,未使用的变量命名为
\uu
\u
这只是约定,任何其他名称的行为方式都相同

Name
\uu
只指向解包元组的第一个元素。当该名称超出范围引用时,计数器将减少,并且不会有其他命名的对“解包元组的第一个元素”的引用,并且可以安全地对该对象进行垃圾收集

由于
\uu
是唯一的约定,因此尝试使用
\u
解包元组的行为将与使用任何其他名称的行为相同-它将引发异常,如下之一:

a, b = 1  # TypeError: 'int' object is not iterable
a, b = () # ValueError: need more than 0 values to unpack
a, b = (1, 2, 3) # ValueError: too many values to unpack

如果堆栈不是由两个项目的序列或iterables组成,则会出现异常。请注意,
\uu
不会执行任何特殊操作(在REPL之外)。这只是另一个变量名。没有任何东西被扔掉。如果你想阅读更多关于
\uu
:完全相同的想法,但是
\uj=[1,2,3]
会引发ValueError,但消息略有不同。为了说明这一点,
\u
在不需要所述变量的值时用作变量名。例如,如果要打印“Hi”五次,则可以对范围(5)中的u使用
:打印“Hi”
,因为不需要索引值。