为什么不是';python中没有忽略特殊变量吗?

为什么不是';python中没有忽略特殊变量吗?,python,iterable-unpacking,Python,Iterable Unpacking,假设我想要分割一个字符串。它返回一个包含3项的元组。我不需要第二项 我读过一篇文章,当一个变量被忽略时,会使用 bar = 'asd cds' start,_,end = bar.partition(' ') 如果我理解正确,则\uu仍填充有该值。我还没有听说过一种忽略部分输出的方法 这难道不能节省周期吗 一个更大的例子是 def foo(): return list(range(1000)) start,*_,end = foo() 根据,有效的变量名可以是这种形式 identif

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

我读过一篇文章,当一个变量被忽略时,会使用

bar = 'asd cds'
start,_,end = bar.partition(' ')
如果我理解正确,则
\uu
仍填充有该值。我还没有听说过一种忽略部分输出的方法

这难道不能节省周期吗

一个更大的例子是

def foo():
    return list(range(1000))
start,*_,end = foo()
根据,有效的变量名可以是这种形式

identifier ::=  (letter|"_") (letter | digit | "_")*
这意味着,变量名称的第一个字符可以是字母或下划线,而名称的其余部分可以是字母、数字或
。因此,
\uuu
在Python中是一个有效的变量名,但不太常用。所以人们通常把它当作use和throw变量来使用

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

start,*_,end = foo()
无论如何,这种解包只能在Python3.x中工作

在您的示例中,您使用了

list(range(1000))

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

忽略返回参数并不会真正节省任何周期,不,除了那些被简单保存的周期,注意到将名称绑定到未使用的返回对象没有任何意义

Python不做任何函数内联或跨函数优化。它一点也没有瞄准这个利基。它也不应该这样做,因为这将损害python擅长的许多方面。python的许多核心功能都取决于其设计的简单性

列表解包示例也是如此。在给定语法的情况下,让python选择列表的最后一项和第一项是很容易想到的语法糖。但是,在python的定义约束范围内,实际上没有办法不首先构建整个列表。谁能说这份清单的编制没有相关的副作用?Python作为一种语言,肯定不会向您保证任何这样的事情。作为一种动态语言,python甚至不知道foo可能返回一个列表,也不试图关心它自己,直到它真正返回列表的那一刻


它会返回一个列表吗?如果恢复列表标识符会怎么样?

当然有一种方法可以只提取几个元素。也就是说:

l = foo()
start, end = foo[0], foo[-1]
那么,你要问的问题是,“为什么没有一行简写法呢?”有两个答案:

  • 这还不够普遍,不需要速记。对于这种不常见的情况,双线解决方案是足够的

  • 特性不需要很好的理由就不存在。这不像Guido van Rossum列出了所有可能的想法然后删除了你的。如果您有改进语法的想法,可以向Python社区提出,看看是否可以让他们实现它


  • 一个聪明的编译器可能会发现变量
    \uu
    没有被使用。有人关心那些微小的额外周期吗?如果是,为什么要使用python来完成此任务?@KarolyHorvath我可能对复制开销的看法是错误的。@KarolyHorvath这个聪明的编译器是存在的,还是你只是在理论上说的?只要提取你想要的输出。。。第一个示例:
    start,end=bar.partition('')[::2]
    start,end=operator.itemgetter(0,-1)(bar.partition('')
    等。。。您甚至可以通过使用
    islice
    /
    next
    和deque等从foo生成器中获取第一个和最后一个列表(将
    列表
    取出-因此在将列表分解为两项之前生成一个列表是最浪费的…)。。。所以这是可行的。。。这不仅仅是Python的功劳:)对不起,after是个打字错误。我的问题是为什么没有呢?