如何在Python中声明数组?

615

我如何在Python中声明一个数组?


47
可能是因为在类 C 的语言中,数组的长度是固定的,而 Python 列表的长度则不是。这更像是 C++ 中的 STL 向量或 Java 中的 ArrayList。 - MAK
138
它被称为列表,因为它就是一个列表。[A(),1,'Foo',u 'öäöäö',67L,5.6]。一个列表。数组是“计算机内存中等间隔地址上项目的排列”(维基百科)。 - Lennart Regebro
3
另外,列表可以包含不同类型的内容,而其他语言的数组通常要求所有元素都是相同类型。 - Ned Batchelder
39
“数组”这个广为人知的术语并没有暗示固定长度或内容的任何信息;这些只是C语言中实现数组时的限制。Python的列表同样是等距的(指内部对象的指针),否则 "getitem" 就不会是O(1)。 - Glenn Maynard
2
重复:https://dev59.com/7nRA5IYBdhLWcg3wtwOe - S.Lott
28
从en.wikipedia.org/wiki/Array_data_structure: "数组数据结构的元素需要具有相同的大小"(对于Python的数组是正确的,而对于Python列表则不正确),并且“在使用数组时,有效索引元组集和元素地址(因此元素寻址公式)通常是固定的”(对于Python的列表或数组都不正确)。 - Alex Martelli
17个回答

413
variable = []

现在,variable引用了一个空列表*

当然,这是一种赋值操作而非声明。在Python中,无法声明“此变量永远只能引用列表”,因为Python是动态类型语言。


*默认的Python内置类型称为list,而不是数组。它是一个有序的容器,可以容纳任意长度的异构对象集合(它们的类型不重要且可以自由混合)。这不应与array模块混淆,后者提供了一种更接近于C语言array类型的类型;其内容必须是同质的(全都是相同类型),但长度仍然是动态的。


15
在JavaScript中,可以像这样初始化数组内容吗?(例如,像variable = ["Hi", "Hello"];这样) - Anderson Green
3
如何声明一个多维数组,比如一个二维数组?你可以使用方括号表示法声明多维数组。例如,要声明一个2D数组,可以使用以下语法:int myArray[row_size][col_size];其中,row_size和col_size分别表示数组的行数和列数。 - Anderson Green
8
在Python中,所谓变量声明并不存在。如果要创建多维列表,你需要创建一个空列表,并将其他列表放到其中;或者,如果列表的维度在编写代码时已知,可以使用字面量直接编写,例如:my_2x2_list = [[a, b], [c, d]]。根据你需要使用多维数组的情况,你还可以考虑使用numpy库,它定义了多维、同质、未装箱数组的数组类型,在适用的情况下可以更加高效,因此在数值计算方面更为优选。 - sepp2k
1
@IfanIqbal 是的,如果它至少包含一个元素,你可以这样做。 - sepp2k
1
它正式被称为列表。 - Arulx Z
显示剩余10条评论

190

这在Python中是一个令人惊讶的复杂话题。

实用回答

数组由类 list 表示(请参见参考资料,不要将它们与生成器混淆)。

查看使用示例:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

理论回答

在Python的底层中,list 实际上是一个包含对项的引用的实际数组的包装器。此外,基础数组还创建了一些额外的空间。

这样做的后果是:

  • 随机访问非常便宜(arr[6653]arr[0] 相同)
  • append 操作是免费的,同时会占用一些额外的空间
  • insert 操作很昂贵

请查看这个操作复杂度的精彩表格

此外,请参见这张图片,我尝试展示数组、引用数组和链表之间最重要的区别:arrays, arrays everywhere


6
补充一下,Python 中有一种非常酷的方式来切割数组:对于 [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2],结果将是 [2, 3, 4, 5, 6, 7] - Anton
3
有时候我会看到这篇文章收到一些负面评分。如果有人能够留言解释一下原因,那就太好了。谢谢。 - Anton
5
你是真正的最有价值球员(MVP)。为了做出合理的编程决策,需要知道实际选择的“列表”设计。基本上它就像C++中的“向量”。谢谢! - Necro
这是一篇非常详细的答案,其中包含了很好的解释! - Ahmed
我可以添加一个实用的符号来进行比较,例如:a == b[:2] 如果 b 数组的前两个元素等于 a 数组的值,则返回 True。 - Bruno L.

141

实际上你不需要声明一个变量来创建Python中的数组:

from array import array
intarray = array('i')

更多信息请参考数组模块:http://docs.python.org/library/array.html

现在可能你不想要一个数组,而是一个列表,但其他人已经回答了这个问题。 :)


12
有点有趣,但不是一个适合“初学者”问题的好回答。简而言之,在Python中,通常使用名为“list”的数据类型。Python还有一种特殊用途的数据类型叫做“array”,更像是C数组,但很少被使用。 - steveha
72
不,但是其他人已经使用了列表。我认为指出还有数组也是一个好答案。 - Lennart Regebro
11
这个回答非常棒。我已经使用Python编程多年,最近才意识到Python有一个真正的数组对象,它与列表对象不同。虽然数据结构非常相似,但是数组限制了数组可以容纳的对象类型。@LennartRegebro做得很好! - Josh Brown
6
这应该是正确的答案。列表和数组是两个不同的概念。谢谢@LennartRegebro。 - Mina Gabriel
1
使用数组而不是列表的一个具体原因在于,如果你有一个名为 myarray 的装满数字的数组,你可以对它执行数学运算,并且这些运算将应用于其内部所有项。因此,如果你执行 myarray/3,内部的每个数字都会被除以3。如果你尝试对列表执行相同的操作,则会出现错误。因此,对于大量的数字数据集,数组更加高效。 - Matthew
1
数组模块仅限于 int 和 float 类型(Unicode 已被弃用),这就是为什么它不为许多 Python 开发人员所知的原因。更多信息请访问 https://www.askpython.com/python/array/python-array-examples - Pankaj

67

我想你的意思是需要一个已经填好了前30个单元格的列表。

   f = []

   for i in range(30):
       f.append(0)

这个可以用在斐波那契数列的例子中。请参见Project Euler的问题2。


104
这是一种相当华丽的列表初始化方式。尝试改用 f = [0] * 30 - John Machin
这与@slehar的答案a = range(10)不同吗?喜欢Python,它的语法和它的禅。 - m3nda
@erm3nda 不对: $ python3 Python 3.4.2 [...]
a = range(10) print (a) range(0, 10)
- arp

38

这就是方法:

my_array = [1, 'rebecca', 'allard', 15]

4
由于这不是Python数组而是Python列表,将其称为“my_list”会不会更清晰易懂? - Mattis Asp
5
这将创建一个列表,而不是数组。在Python中,它们是不同的,并具有不同的属性。特别地,你可以对数组执行数值操作,但不能对列表执行。 - Matthew
1
该语句并未回答所提出的问题。 - Rick Henderson

26

进行计算时,可以像这样使用NumPy数组:

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

这些numpy数组可以保存到磁盘上并从磁盘上加载(甚至可以压缩),而且具有大量元素的复杂计算速度非常快,就像C语言一样。

在科学环境中广泛使用。更多信息请参见这里


25

JohnMachin's comment应该是真正的答案。 在我看来,所有其他答案只是权宜之计! 所以:


array=[0]*element_count

3
同意,但要小心称呼可变的“array”,否则会招致纯粹主义者的愤怒。此外,我还想补充一点,你可以类似地创建“多维数组”:x=[[0] * 10] * 10 - Peter S Magnusson
1
是的,这仍然是一个列表。使用type()函数自行确定。 - Rick Henderson
2
@PeterSMagnusson,对于多维数组,你尤其不应该这样做。因为它会导致每一行都相同,因为它们都是指向同一个对象的引用。例如,试试这个:x = [[0]*5]*5; x[1][2] = 1; print(x) - Johan
@johan 当然是对的!修复方法是:import copy; x = [copy.copy(x) for x in [[0]*5]*5]; x[0] is x[1] - Peter S Magnusson

22

有一些贡献建议Python中的数组由列表表示。这是不正确的。Python在标准库模块array中有一个独立的实现array(),因此混淆两者是不正确的。在Python中,列表就是列表,所以要注意使用术语。

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

列表和 array.array() 之间有一个非常重要的区别。虽然这两个对象都是有序序列,但 array.array() 是有序的同质序列,而列表是不同质序列。


17

在Python中,你不需要声明任何东西,只需直接使用即可。我建议你从这样一个网站开始学习:http://diveintopython.net


2
有时候你必须声明一个变量的类型:如果你在控制结构之外没有使用过它,那么它在控制结构之外是不存在的,你将会创建一个新的变量。假设这个变量是一个 int 类型,如果你把它用作更复杂的类型,就会产生冲突。 - Clearer
@Clearer 是的,有时候使用函数需要声明它,有时候在使用函数时也需要使用一些全局变量,这样就不需要在函数中写太多参数。 - m3nda
这不仅仅是函数的问题;一个简单的if语句也可能会给你带来同样的问题。 - Clearer
2
编程就是关于声明的,无论你使用哪种语言。类型声明则是完全不同的故事。 - Outside_Box
虽然此链接可能回答了问题,但最好在此处包含答案的基本部分并提供链接以供参考。仅有链接的答案可能会在链接页面更改时变得无效。 - ClimateUnboxed
@bayer 链接已失效。 - Mehdi Charife

13

我通常会这样做:a = [1,2,3],这实际上是一个列表,但对于数组,请查看这个正式的定义


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接