python计算数组大小_如何在Python中分配数组大小

本文探讨了Python中列表乘法导致的引用问题,解释了列表作为可变对象如何在内存中处理,以及如何避免因乘法操作引起的意外修改。通过实例展示了列表乘法如何创建指向同一内存位置的多个引用,并提出了创建独立列表的建议方法,以确保列表元素的独立性。
摘要由CSDN通过智能技术生成

问题就在这里:array_ab = [['?'] * 4] * 3

这个问题是由python选择通过对象引用传递列表造成的。因为列表是可变对象。

但是由于列表可能会变得非常大,而不是在内存中移动整个列表,所以Python选择只使用引用(C术语中的“指针”)。如果将一个指定给另一个变量,则只指定对它的引用。这意味着您可以让两个变量指向内存中的同一列表:>>> a = [1]

>>> b = a

>>> a[0] = 2

>>> print b

[2]

因此,在您的第一行代码中有['?'] * 4。

现在['?']是指向内存中的值?的指针,当您对其进行乘法运算时,会得到指向内存中相同位置的指针。

但是,当您更改其中一个值时,Python知道指针需要更改以指向新值:>>> a = 4 * ['?']

>>> a

['?', '?', '?', '?']]

您可以验证列表中元素的id:>>> [id(v) for v in a]

[33302480, 33302480, 33302480, 33302480]

>>> a[0] = 1

>>> a

[1, '?', '?', '?']

当你把这个列表相乘时,问题就来了——你得到了列表指针的四个副本。

现在,当您更改一个列表中的一个值时,这四个值将一起更改。

建议的方法是先创建一个所需长度的列表,然后用新创建的列表填充每个元素:>>> A = [None] * 3

>>> for i in range(3):

... A[i] = [None] * 4

...

>>> A

[[None, None, None, None], [None, None, None, None], [None, None, None, None]]

>>>

这将生成一个包含3个长度为4的不同列表的列表。

或者您可以使用列表理解:w, h = 4, 3

A = [[None] * w for i in range(h)]

[[None, None, None, None], [None, None, None, None], [None, None, None, None]]

编辑2

根据标题,在“高级”中无法为列表分配准确的内存。Python list正在使用某种算法来过度分配列表大小,以便将来进行额外的增长。/* This over-allocates proportional to the list size, making room

* for additional growth. The over-allocation is mild, but is

* enough to give linear-time amortized behavior over a long

* sequence of appends() in the presence of a poorly-performing

* system realloc().

* The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值