【问题标题】:How does python "throw away" variable work?python“丢弃”变量如何工作?
【发布时间】:2016-07-18 20:08:04
【问题描述】:

假设我有:

[obj for (_, obj) in stack]

这段代码假定stack 中的第一个对象是一个元组,并丢弃了元组的第一部分。

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

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

【问题讨论】:

  • 如果您的堆栈不包含 2 个项目的序列或可迭代项,您将收到异常。
  • 请注意,_ 没有做任何特别的事情(在 REPL 之外)。这只是另一个变量名。没有东西被扔掉。
  • 如果您想了解更多关于_的目的:stackoverflow.com/questions/5893163/…

标签: python


【解决方案1】:

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

Name _ 只是指向解压元组的第一个元素。当该名称超出范围引用时,计数器减少,没有其他命名引用“未打包元组的第一个元素”,并且该对象可以安全地进行垃圾回收。

由于 _ 只是约定,尝试使用 _ 解包元组的行为与使用任何其他名称相同 - 它会引发异常,以下情况之一:

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】:

    不,它会引发异常。

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

    在这里使用_ 只是一个约定。它用于开发人员阅读代码(“哦,他的意思是该变量不会用于任何事情”)。但是对于解释器,它在这种情况下没有任何意义,它也可能是任何其他标识符名称。


    如果代码不是元组,而是单个对象会怎样?

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

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

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

    【讨论】:

    • 完全相同的想法,但_, obj = [1, 2, 3] 引发 ValueError 的消息略有不同。
    • 为了说明,_在不需要该变量的值时用作变量名。例如,如果你想打印五次“Hi”,你可以使用for _ in range(5): print 'Hi',因为你不需要索引值。
    【解决方案3】:

    您在 for 循环中使用的称为 iterable-unpacking,这意味着任何可迭代对象都被解包为变量名:

    a, b, c, ... = iterable
    

    左边的变量个数必须和右边的iterable中的项匹配。

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

    在您的 for 循环中,您只使用第二个参数,按照惯例,未使用的变量命名为 _

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多