382

如果我有以下 Python 代码

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]

x保证永远是[1,2,3],或者临时元素的其他顺序是否可能?

4

7 回答 7

574

是的,python 列表中元素的顺序是持久的。

于 2012-12-04T00:11:45.860 回答
101

简而言之,是的,订单被保留了。长篇:

通常,以下定义将始终适用于列表等对象:

列表是可以包含重复元素的元素的集合,并且具有定义的顺序,除非明确要求,否则通常不会更改。堆栈队列都是为添加和删除元素提供特定(通常是有限的)行为的列表类型(堆栈是 LIFO,队列是 FIFO)。列表是事物列表的实际表示。一个字符串可以被认为是一个字符列表,因为顺序很"abc" != "bca"重要("aaa"!= "a"

集合是元素的集合,这些元素不能包含重复项,并且具有可能会或可能不会随时间变化的不确定顺序。集合并不代表事物的列表,而是描述了特定事物选择的范围。set 的内部结构,它的元素如何相互存储,通常并不意味着传达有用的信息。在某些实现中,集合总是在内部排序;在其他情况下,排序只是未定义的(通常取决于散列函数)。

集合是一个通用术语,指的是用于存储(通常是可变的)数量的其他对象的任何对象。列表和集合都是集合的一种。元组和数组通常不被视为集合。一些语言也将映射(描述不同对象之间关联的容器)视为一种集合。

这种命名方案适用于我所知道的所有编程语言,包括 Python、C++、Java、C# 和 Lisp(其中不按顺序排列的列表将特别具有灾难性)。如果有人知道情况并非如此,请直接说出来,我会编辑我的答案。请注意,特定实现可能对这些对象使用其他名称,例如C++中的vector和 ALGOL 68 中的flex(这两个列表;flex 在技术上只是一个可调整大小的数组)。

如果由于+标志在这里的具体工作方式而在您的情况下留下任何混淆,请知道顺序对列表很重要,除非有充分的理由相信否则您几乎总是可以安全地假设列表操作保持顺序. 在这种情况下,+符号的行为很像字符串(实际上只是字符列表):它获取列表的内容并将其放在另一个列表的内容后面。

如果我们有

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]

然后

list1 + list2

是相同的

[0, 1, 2, 3, 4] + [5, 6, 7, 8, 9]

评估为

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

很像

"abdcde" + "fghijk"

生产

"abdcdefghijk"
于 2012-12-04T00:17:25.380 回答
9

您混淆了“集合”和“列表”。集合不能保证顺序,但列表可以。

集合使用大括号声明:{}. 相反,列表使用方括号声明:[].

mySet = {a, b, c, c}

不保证顺序,但 list 可以:

myList = [a, b, c]
于 2015-11-20T22:41:45.457 回答
5

我想你可能关心的一件事是条目是否会改变,例如,2 会变成不同的数字。在这里您可以放心,因为在 Python 中,整数是不可变的,这意味着它们在创建后无法更改。

不过,并非 Python 中的所有内容都是不可变的。例如,列表是可变的——它们可以在创建后更改。例如,如果你有一个列表列表

>>> a = [[1], [2], [3]]
>>> a[0].append(7)
>>> a
[[1, 7], [2], [3]]

在这里,我更改了a(我添加7到它的)的第一个条目。可以想象,如果您不小心,会在此处乱序排列,并在这里得到意想不到的东西(实际上,当每个人以某种方式开始使用 Python 编程时,这确实会发生在每个人身上;只需在此站点上搜索“在循环中修改列表它”查看数十个示例)。

还值得指出的是x = x + [a]x.append(a)它们不是一回事。第二个 mutates x,第一个创建一个新列表并将其分配给x。要查看差异,请y = x在添加任何内容之前尝试设置x并尝试每个设置,并查看两者对y.

于 2013-10-24T04:52:56.427 回答
1

是的,除非您对其执行其他操作,否则列表将保持为 [1,2,3]。

于 2021-03-10T21:20:10.313 回答
0

aList=[1,2,3]

我=0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

一个列表

[2]

道德是在由列表驱动的循环中修改列表时,需要两个步骤:

aList=[1,2,3]
i=0
for item in aList:
    if i<2:
        aList[i]="del"
    i+=1

aList

['del', 'del', 3]
for i in range(2):
    del aList[0]

aList
[3]
于 2014-11-06T15:19:01.490 回答
0

是的,列表和元组总是有序的,而字典不是

于 2016-10-11T19:57:21.820 回答