2012-03-19 63 views
2

我是一名python初学者。最近我看到这段代码:python:使用元组重新排列列表的内容

>>> words = ['I', 'turned', 'off', 'the', 'spectroroute'] 
>>> words[2], words[3], words[4] = words[3], words[4], words[2] 
>>> words 
['I', 'turned', 'the', 'spectroroute', 'off'] 

我对第二行感到困惑。看起来使用了元组,但我不明白为什么列表的顺序改变为结果?

它看起来像2号线是这样做的:

>>> tmp = words[2] 
>>> words[2] = words[3] 
>>> words[3] = words[4] 
>>> words[4] = tmp 

我的问题是:为什么在第二行的代码更改列表的结果呢?

在此先感谢

+0

在您选择的Python参考中查找“元组赋值”。 – 2012-03-19 21:52:43

+0

使用元组* *。 ','字符定义了一个元组,元素只是为了清晰和需要时的优先级。 – Daenyth 2012-03-19 22:36:26

回答

1

你是非常正确的。它在右侧(在内存中)创建一个元组,然后将其值解压到原始列表中,从而覆盖以前的索引。这就是为什么你不需要一个tmp变量,因为它发生在内存中。

它类似这样的理念:

a, b, c = (1, 2, 3) 
+0

所以这意味着它与此类似:词语[0],词语[1],词语[2],词语[3],词语[4] =(词语[2],词语[3],词语[4 ] =单词[3],单词[4],单词[2])?为什么它不是这样:单词[0],单词[1],单词[2],单词[3],单词[4] =(单词[0],单词[1],单词[3],单词[4],单词[2])? – 2012-03-19 22:02:15

+0

你的评论中的第一个例子是一个语法错误,所以没有它的不正确。你的第二个例子在技术上是等同的。但是不需要设置列表的第一和第二个索引等于它们的原始值。您只修改列表中不同索引处的元素。 “单词”是一个列表容器。它包含5个元素,可以通过它们的0-4索引号进行访问和重新分配。另外请记住,'words'列表对象在整个时间内从未成为任何新对象。只有其内容发生了变化。 – jdi 2012-03-19 22:27:08

2

列表是一个可变的数据结构。 words[2] = 'foobar'将把列表中的第三个元素更改为'foobar'。在

>>> words[2], words[3], words[4] = words[3], words[4], words[2] 

右侧首先计算和生成的字符串被分配给列表中的不同位置,从而改变它。