Python 这两个变量是如何解包的?

Python 这两个变量是如何解包的?,python,variables,Python,Variables,通过教程,我了解到可以在同一语句中定义两个变量,例如: In [15]: a, b = 'hello', 'hi!' In [16]: a Out[16]: 'hello' In [17]: b Out[17]: 'hi!' 那么这对这里有什么影响呢 fh, opened = cbook.to_filehandle(fname, 'w', return_opened = True) 我进一步指出: In [18]: fh Out[18]: <open file 'attempt.c

通过教程,我了解到可以在同一语句中定义两个变量,例如:

In [15]: a, b = 'hello', 'hi!'

In [16]: a
Out[16]: 'hello'

In [17]: b
Out[17]: 'hi!'
那么这对这里有什么影响呢

fh, opened = cbook.to_filehandle(fname, 'w', return_opened = True)
我进一步指出:

In [18]: fh
Out[18]: <open file 'attempt.csv', mode 'w' at 0xaac89d0>

In [19]: opened
Out[19]: True

我的猜测是,函数内部看起来像这样:

def to_filehandle(filename, mode, return_opened=False):
    # do something to open the file and set opened
    # to True if it worked, False otherwise
    if return_opened:
        return the_filehandle, opened
    else:
        return the_filehandle

return_opened关键字参数没有什么特别或神奇之处;它只是简单地改变了这个特定函数的行为。

我的猜测是,函数内部看起来像这样:

def to_filehandle(filename, mode, return_opened=False):
    # do something to open the file and set opened
    # to True if it worked, False otherwise
    if return_opened:
        return the_filehandle, opened
    else:
        return the_filehandle

return_opened关键字参数没有什么特别或神奇之处;它只是改变这个特定函数的行为。

在Python中,一个函数有多个返回值。在本例中,函数“cbook.to_filehandle”返回两个值


关于这个错误,我认为在我们知道“cbook.to_filehandle”应该做什么或看到它的代码之前,我们无法对其进行详细说明。

在Python中,一个函数有多个返回值。在本例中,函数“cbook.to_filehandle”返回两个值


关于这个错误,我认为在我们知道“cbook.to_filehandle”应该做什么或看到它的代码之前,我们无法对其进行详细说明。

对于元组分配,右侧不需要是一个显式元组:

x = 1, 0
a, b = x
做与以下相同的事情:

a, b = 1, 0
如果函数返回元组,可以使用元组分配将其解包:

def my_fn():
    return 1, 0

a, b = my_fn()

对于元组分配,右侧不需要是显式元组:

x = 1, 0
a, b = x
做与以下相同的事情:

a, b = 1, 0
如果函数返回元组,可以使用元组分配将其解包:

def my_fn():
    return 1, 0

a, b = my_fn()

解包不是一个神奇的过程:例如,每个元组1、2、3是一个具有三个值的元组,可以解包为三个值。但元组本身也是一个值,因此可以将其分配给变量或从函数返回:

x = (1, 2, 3)
a, b, c = x

# Or, for example :
def function_returning_a_tuple():
    return (True, False)

a, b = function_returning_a_tuple()

正如您现在所了解的,cbook.to_filehandle只是一个返回两个值的元组文件的函数。这并没有什么神奇之处,返回的参数也没有什么不同。

解包不是一个神奇的过程:例如,每个元组1、2、3是一个有三个值的元组,可以解包成三个值。但元组本身也是一个值,因此可以将其分配给变量或从函数返回:

x = (1, 2, 3)
a, b, c = x

# Or, for example :
def function_returning_a_tuple():
    return (True, False)

a, b = function_returning_a_tuple()

正如您现在所了解的,cbook.to_filehandle只是一个返回两个值的元组文件的函数。这背后没有什么魔力,关于返回的东西没有任何魔力。参数处理方式不同。

正如@dcrosta所说,变量名没有任何魔力。要更好地了解发生了什么,请尝试:

result = cbook.to_filehandle(fname, 'w', return_opened=True)
然后检查result,typeresult,等等:你会看到它是一个元组,可以想象是一个列表或其他序列,但不可能只有两个项目。结果[0]将是一个打开的文件,结果[1]将是一个布尔值。很可能,这是因为函数to_filehandle是用return thefile编码的,类似bool语句,正如dcrosta推测的那样

所以,这部分是打包-两个东西被打包成一个返回值,使后者成为一个包含两个项目的元组。当您以后执行以下操作时,将打开包装部分:

fh, opened = result

两项序列被分解成两个变量。通过直接解包,您只需删除中间人,我在这里命名为result的变量,以便在解包之前更容易检查函数调用的结果。如果你事先知道你总是会得到一个两个项目的序列,并且不需要序列本身,而是每个项目都有一个单独的名称,那么你最好立即解包并保存一个中间步骤——这就是它的全部内容

正如@dcrosta所说,变量名没有什么神奇之处。要更好地了解发生了什么,请尝试:

result = cbook.to_filehandle(fname, 'w', return_opened=True)
然后检查result,typeresult,等等:你会看到它是一个元组,可以想象是一个列表或其他序列,但不可能只有两个项目。结果[0]将是一个打开的文件,结果[1]将是一个布尔值。很可能,这是因为函数to_filehandle是用return thefile编码的,类似bool语句,正如dcrosta推测的那样

所以,这部分是打包-两个东西被打包成一个返回值,使后者成为一个包含两个项目的元组。当您以后执行以下操作时,将打开包装部分:

fh, opened = result
两项序列被分解成两个变量。通过直接解包,您只需删除中间人,我在这里命名为result的变量,以便在解包之前更容易检查函数调用的结果。如果你事先知道你总是会得到一个两个项目的序列,并且不需要序列本身,而是每个项目都有一个单独的名称,那么你最好立即解包并保存一个中间步骤——这就是它的全部内容