【问题标题】:What does 'x, y =' mean in python syntax? [duplicate]python语法中的'x,y ='是什么意思? [复制]
【发布时间】:2013-12-05 01:14:50
【问题描述】:

我是 python 新手,正在尝试通过 http://yuji.wordpress.com/2011/06/22/python-imaplib-imap-example-with-gmail/ 工作,其中包含以下行:

result, data = mail.uid('search', None, "ALL") # search and return uids instead

有人能解释一下这条线吗?

谢谢。

【问题讨论】:

    标签: python


    【解决方案1】:

    表示你调用的函数返回了一个iterable,iterable的索引0赋值给x,索引1赋值给y。这称为tuple unpacking。

    例如)

    >>> def func(a,b):
    ...     return b,a
    ... 
    >>> a = 5
    >>> b = 7
    >>> a,b = func(a,b)
    >>> a 
    7
    >>> b
    5 
    >>> x = func(a,b)
    >>> x
    (5, 7)
    

    编辑以显示返回多个值,默认情况下将它们打包为元组,然后在另一端解包。由于这里只有一个变量x,所以将元组赋值给x。

    交换两个变量的简单函数(仅作为示例)回答您的问题

    【讨论】:

    • 对于任何可迭代对象也是如此,而不仅仅是元组。
    • 不一定是元组。它可以是任何可迭代的,具有与要分配的变量一样多的元素。元组可能是最常见的,可能其次是列表,但它甚至可以是生成器、字符串或 4 元素列表上的半耗尽迭代器。
    • 谢谢 - 所有 python 函数都必须返回元组吗?
    • @user61629:如果你让一个函数返回多个变量,它会被打包并作为一个元组返回。赋值前,如果另一端有多个变量,则对元组进行解包。
    • 谢谢,但现在我很困惑:这是否与 James Wucher 上面所说的冲突:“您可以返回元组、列表、数字、字符串、类实例、函数、字典、狮子、老虎、熊等,以及“无”“?
    【解决方案2】:

    至少,从 python 2.7.x 开始,该函数将解压缩从函数返回的 2 个参数的元组。如果它返回 元组中的 2 个参数以外的任何参数,我相信如果您尝试解包更多内容,它会引发错误。例如,如果它返回 3 个参数并且您解压缩 2 个参数,您将得到一个异常。

    例如:

    def func(a):
        return (a,a+1,a*2)
    
    a,b,c = func(7)
    print a,b
    

    ==> 7 8 # 注意值

    a = func(3)
    print a
    

    ==> (3, 4, 6) # 注意:元组

    a,b = func(9)
    print a,b
    

    ==> 异常 - ValueError: 要解压的值太多

    这在 3.0+ 中可能会有所不同。

    【讨论】:

    • 谢谢,就我自己的信息而言,所有 python 函数都必须按照惯例返回元组吗?
    • 不。您可以返回元组、列表、数字、字符串、类实例、函数、字典、狮子、老虎、熊等,以及“无”(未显式返回时的默认值)。您应该知道返回的“什么”(即知道您的 API)。
    【解决方案3】:

    另一个答案,“你调用的函数返回一个可迭代的”是一个很好的答案。这就是您的具体示例中发生的情况。这就是python中所谓的“解包”。以下是与您的问题相关的拆包和分配示例:

    >>> a,b = 1,2
    >>> a
    1
    >>> b
    2
    >>> a,b,c = ['do', 're', 'mi']
    >>> a
    'do'
    >>> b
    're'
    >>> c
    'mi'
    >>> 
    

    这是 Python 语法的漂亮特性之一。如果我没记错的话,它也是经过优化的——即达到结果的最快方式。

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 2012-06-27
      • 2014-11-06
      • 2019-12-23
      • 2012-01-09
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多