为什么在python中没有忽略特殊变量?

时间:2014-01-25 19:08:36

标签: python iterable-unpacking

假设我想分区字符串。它返回3个元组的元组。我不需要第二项。

我已经读过,当要忽略变量时会使用_

bar = 'asd cds'
start,_,end = bar.partition(' ')

如果我理解正确,_仍然填充了该值。我没有听说过忽略输出部分的方法。

这不会节省周期吗?

更大的例子是

def foo():
    return list(range(1000))
start,*_,end = foo()

3 个答案:

答案 0 :(得分:3)

通过注意没有必要将名称绑定到未使用的返回对象,它不会真正保存任何循环来忽略返回参数,no,除了那些通常被保存的那些。

Python不执行任何函数内联或跨函数优化。它没有丝毫针对那个利基市场。也不应该这样做,因为这会损害python擅长的许多东西。许多核心python功能取决于其设计的简单性。

列表解包示例相同。考虑到语法,很容易想到语法糖让python选择列表的最后一项和第一项。但是,没有办法,保持在python的定义约束内,实际上不首先构造整个列表。谁说清单的构建没有相关的副作用? Python,作为一种语言,肯定不会保证你有任何这样的东西。作为一种动态语言,python甚至没有丝毫的线索,或试图关注自己,因为foo可能会返回一个列表,直到它实际上这样做。

它会返回一个清单吗?如果你反弹列表标识符怎么办?

答案 1 :(得分:1)

根据docs,有效的变量名称可以是这种形式

identifier ::=  (letter|"_") (letter | digit | "_")*

这意味着,变量名的第一个字符可以是字母或下划线,名称的其余部分可以是字母或数字或_。因此,_是Python中的有效变量名,但不太常用。所以人们通常像使用和抛出变量一样使用它。

您显示的语法无效。应该是

start,*_,end = foo()

无论如何,这种解包只能在Python 3.x中使用

在您的示例中,您已使用

list(range(1000))

因此,整个列表已经构建完毕。当您返回它时,实际上是返回对列表的引用,实际上不会复制这些值。因此,没有特定的方法可以忽略这些值。

答案 2 :(得分:1)

当然有一种方法可以提取一些元素。即:

l = foo()
start, end = foo[0], foo[-1]

你问的问题是,“为什么不存在单行速记呢?”有两个答案:

  1. 需要速记是不常见的。这种双线解决方案足以应对这种罕见的情况。

  2. 功能不需要存在的充分理由。这并不像Guido van Rossum编制了所有可能的想法列表,然后打败了你的。如果您对改进的语法有所了解,可以将它提交给Python社区,看看是否可以让它们实现它。