是否保证Python列表的元素保持按插入顺序排列?

sam*_*moz 302 python

如果我有以下Python代码

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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

sge*_*sge 439

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

  • 这是正确的答案,所以我不想添加另一个.他也可以使用list.append来让他放心.http://docs.python.org/2/tutorial/datastructures.html (14认同)
  • 是的,python列表中元素的顺序是持久的.;) (6认同)

App*_*ish 79

简而言之,是的,订单得以保留.长期:

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

一个列表是一个可以包含重复的元素,并具有已定义的顺序通常不会改变,除非明确做这样的元素的集合.堆栈队列都是列表类型,它们为添加和删除元素提供特定的(通常是有限的)行为(堆栈为LIFO,队列为FIFO).列表是事物列表的实际表示.字符串可以被认为是字符列表,因为顺序很重要("abc" != "bca")并且字符串内容中的重复项当然是允许的("aaa"可以存在和!= "a").

是不能包含重复元素的集合,并且具有可以或可以不随时间而改变的非定顺序.因为它们所描述的设置并不代表事情列出这么多的程度的事情有一定的选择的.集合的内部结构,其元素如何相对于彼此存储,通常并不意味着传达有用的信息.在一些实现中,集合总是在内部排序; 在其他情况下,排序只是未定义(通常取决于散列函数).

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

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

如果你的案例中有任何混淆由于+标志在这里工作的具体情况,只要知道顺序对于列表很重要,除非有充分的理由相信,否则你几乎总能安全地假设列表操作保留顺序.在这种情况下,+符号的行为与字符串(它实际上只是字符列表)的行为非常相似:它采用列表的内容并将其置于另一个列表的内容之后.

如果我们有

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

然后

list1 + list2
Run Code Online (Sandbox Code Playgroud)

是相同的

[0, 1, 2, 3, 4] + [5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

评估为

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

很像

"abdcde" + "fghijk"
Run Code Online (Sandbox Code Playgroud)

产生

"abdcdefghijk"
Run Code Online (Sandbox Code Playgroud)


asm*_*rer 5

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

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

>>> a = [[1], [2], [3]]
>>> a[0].append(7)
>>> a
[[1, 7], [2], [3]]
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

你会混淆'集'和'列表'.套装不保证订单,但列表可以.

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

mySet = {a, b, c, c}
Run Code Online (Sandbox Code Playgroud)

不保证订单,但列表确实:

myList = [a, b, c]
Run Code Online (Sandbox Code Playgroud)