这一机制的运作方式是两个特征的组合 - 形成隐元组和元组/列表解包。
当你做something = x, y时,Python会做的是隐式地创建一个tuple(一种不可变列表),它由两个元素x和y组成。所以,下面的代码两行是完全等价的:
something = x, y
something = (x, y)
的元组,当然可以,包含两个以上要素:
something = a, b, c, d, e
something = (a, b, c, d, e)
此功能的打算用例是使其更容易/清洁剂做的事情一样返回多个值从一个函数:
def foo():
return "hello", "world"
第二反馈eature是元组/列表开箱。每当你在左边有一系列变量,以及任何类型的列表,元组或其他集合时,Python都会尝试将右边的每个元素与左边的元素进行匹配:
>>> a, b, c = [11, 22, 33]
>>> print(a)
11
>>> print(b)
22
>>> print(c)
33
如果有帮助,行a, b, c = [11, 22, 33]基本上等同于做:
temp = [11, 22, 33]
a = temp[0]
b = temp[1]
c = temp[2]
注意,右侧可以从字面上任何类型的集合,而不只是元组或列表。所以下面的代码是有效的:
>>> p, q = "az"
>>> print(p + " " + q)
a z
>>>
>>> s, t = {'cat': 'foo', 'dog': 'bar'}
>>> print(s + " " + t)
cat dog
(虽然,因为在Python字典没有义务要在任何特定的顺序,而且由于键的顺序可以自由炒,拆包他们可能不会因为每次你都可能得到不同的结果。)
如果变量的数量和集合中的元素数量不匹配,Python会抛出异常:
>>> a, b = (1, 2, 3)
Traceback (most recent call last):
File "", line 1, in
ValueError: too many values to unpack (expected 2)
>>> a, b, c = (1, 2)
Traceback (most recent call last):
File "", line 1, in
ValueError: need more than 2 values to unpack
因此,这意味着,如果我们从上面传来叫我们foo功能,做以下内容:
>>> x, y = foo()
...变量x就等于字符串"hello"和可变y就等于字符串"world"。
所以,最后,这意味着你原来的代码片段:
x = "salil"
y = "Ajay"
y, x = x, y
...在逻辑上等同于以下内容:
x = "salil"
y = "Ajay"
temp = (x, y) # evaluates to ("salil", "Ajay")
y, x = temp
...甚至细分更多,在逻辑上等同于以下内容:
x = "salil"
y = "Ajay"
temp = (x, y) # evaluates to ("salil", "Ajay")
y = temp[0]
x = temp[1]
请注意,您可以将这两种操作分开进行。首先形成并评估元组,然后将元组解压缩回变量。最终结果是您的两个变量的值互换。 (但是,事实证明,CPython解释器(Python的原始和'标准'实现)在这里做了一些优化:它将优化交换并且不会完成整个元组的解包 - 参见下面的评论我不确定是否Python的其他实现也是这样做的,尽管我怀疑它们可能会这样做。无论如何,这种优化是针对特定实现的,并且独立于Python语言本身的设计。)