我基本上想要一个 Python 版本的这个 C 数组:
int a[x];
但在Python中,我像这样声明数组:
a = []
问题是我想分配随机槽位并赋予像以下这样的值:
a[4] = 1
但是使用Python无法这样做,因为Python列表为空(长度为0)。
我基本上想要一个 Python 版本的这个 C 数组:
int a[x];
但在Python中,我像这样声明数组:
a = []
问题是我想分配随机槽位并赋予像以下这样的值:
a[4] = 1
但是使用Python无法这样做,因为Python列表为空(长度为0)。
如果你指的是 Python 列表而非“数组”,你可以使用
a = [0] * 10
或者a = [None] * 10
如果我理解得正确,你不能在Python中完全实现你想要的。你需要为列表(或你所称的数组)的每个元素赋值。
但是,尝试这样做:
a = [0 for x in range(N)] # N = size of list you want
a[i] = 5 # as long as i < N, you're okay
对于其他类型的列表,使用除0以外的值。 None
通常也是一个不错的选择。
range(N)
将已经生成一个列表。 - Apalalaxrange(N)
。但我不确定它是否有些不正确。与a = range(N)
相比,我更喜欢它,因为每个元素都以合理的“默认值”开始。我想这是一个观点问题。 - dappawit您可以使用numpy:
import numpy as np
来自空数组的示例:
np.empty([2, 2])
array([[ -9.74499359e+001, 6.69583040e-309],
[ 2.13182611e-314, 3.06959433e-309]])
np.empty
并不会创建一个真正的“空”数组——所有种类的奇怪数据都会在其中,就像示例所展示的那样。如果你想要一个数值数组,请使用np.zeros
。 - Rolya= []
a.extend([None]*10)
a.extend([None]*20)
只需声明列表并附加每个元素。例如:
a = []
a.append('first item')
a.append('second item')
如果您(或其他搜索该问题的人)真正想要创建一个连续的数组来填充整数,请考虑使用bytearray和memoryview:
# cast() is available starting Python 3.3
size = 10**6
ints = memoryview(bytearray(size)).cast('i')
ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))
ints[0]
# 0
ints[0] = 16
ints[0]
# 16
还可以创建指定大小的空数组:
array = [[] for _ in range(n)] # n equal to your desired size
array[0].append(5) # it appends 5 to an empty list, then array[0] is [5]
array = [] * n
,那么如果您修改一个项目,则所有项目都会以相同的方式进行更改,因为它是可变的。x=[]
for i in range(0,5):
x.append(i)
print(x[i])
import array
a = array.array('i', x * [0])
a[3] = 5
try:
[5] = 'a'
except TypeError:
print('integers only allowed')
numpy
命令np.empty(size)
返回给定大小的非初始化数组。这里的“未初始化”意味着条目(数组中的值)是完全随机的,通常是垃圾,结果是先前在新分配的内存中的内容。因此,是的,被视为指向内存的变量已初始化,但存储在其中的值即其中的值并没有初始化--一些作者确实将这种情况称为“未初始化变量”,特别是在C语言中,你很可能会这样做。 - Max分配“随机插槽”的(我认为唯一)方法是使用字典,例如:
a = {} # initialize empty dictionary
a[4] = 1 # define the entry for index 4 to be equal to 1
a['French','red'] = 'rouge' # the entry for index (French,red) is "rouge".
这对于“快速hack”非常方便,如果您对数组元素的访问不是很频繁,那么查询开销就无关紧要了。否则,最好使用预分配的(例如numpy)固定大小的数组进行操作,可以通过a = np.empty(10)
(用于长度为10的未初始化向量)或a = np.zeros([5,5])
(用于 用零初始化的5x5矩阵)来创建。
备注:在您的C示例中,在分配(您的int a[x];
)之前,您还必须分配数组以便指定(不太)“随机的槽位”(即0到x-1之间的整数索引)。
参考文献:
a = [obj] * N
的时候需要注意,数组中每个元素都是同一个对象。如果这个对象可变,并且你修改了其中一个元素,所有元素都会被改变。但是,对于这个例子使用整数(或其他不可变类型)来说并没有影响。或者,如果你只是给元素赋值而不修改它们,那么也不是问题。(我提到这点是因为我经常犯这个错误 :)) - dappawit