python“扔掉”变量如何工作?

时间:2016-03-30 17:05:52

标签: python

让我说我有:

[obj for (_, obj) in stack]

此代码假定stack中的第一个对象是一个元组,并抛弃元组的第一部分。

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

它是否只是忽略抛弃的部分并占据整个对象?

3 个答案:

答案 0 :(得分:2)

不,它会引发异常。

>>> _, obj = [0]
ValueError: need more than 1 value to unpack

使用_只是一个约定。它用于开发阅读代码(“哦,他的意思是变量不会被用于任何东西”)。但是对于解释器来说,在这种情况下它并不意味着什么,它也可能是任何其他标识符名称。

  

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

这是在python3中得到改进的地方,你可以使用这个新选项:

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

解压缩“last”对象现在仍然有效,而不是引发异常,无论容器中是否有1,2或3个以上的项目。

答案 1 :(得分:2)

_它只是一个约定,任何其他名称的行为方式都相同。

名称_只指向解压缩元组的第一个元素。当该名称超出范围引用时,计数器减少,没有其他命名引用解压缩元组的第一个元素",并且该对象可以安全地被垃圾收集。

由于_仅是约定,因此尝试使用_解包元组的行为与任何其他名称相同 - 它会引发异常,如下所示:

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

答案 2 :(得分:0)

你在for循环中使用的东西称为iterable-unpacking,这意味着任何iterable都被解包为变量名:

_

左侧的变量数必须与右侧的iterable中的项匹配。

如果数字不相等,则引发ValueError,如果右侧不可迭代,则引发TypeError。

在你的for循环中,你只使用第二个参数,按照惯例,未使用的变量被命名为self.errordialog(errormessage)