0

而不是通过list.append()将值附加到 list ,为什么我不能像这样为它分配一个值?

In [24]: def a():
   ....:     a1=[5]
   ....:     print a1[0]
   ....:     

In [25]: a()
5

In [28]: def a():
   ....:     a1=[5]
   ....:     a1[1]=12
   ....:     print a1[1]
   ....:     

In [29]: a()
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/home/dubizzle/webapps/django/dubizzle/<ipython-input-29-72f2e37b262f> in <module>()
----> 1 a()

/home/dubizzle/webapps/django/dubizzle/<ipython-input-28-681d86164e67> in a()
      1 def a():
      2     a1=[5]
----> 3     a1[1]=12
      4     print a1[1]
      5 

IndexError: list assignment index out of range
4

6 回答 6

4

a=[5]创建一个大小为 1 的列表。以下是有效的:

a[0] = 1

但是您不能仅通过将值分配给给定的不存在的位置来更改列表的大小。

不过,您可以使用appendor扩展列表+=

a.append(2)
a += [2]

您还可以预先分配给定大小的列表:

a = [0] * 4

这将为您提供一个包含四个元素(全为零)的列表。之后,您可以更改 0-3 范围内的任何元素。

作为参考,这里有一些关于python.org 列表的文档。

于 2012-07-18T12:45:41.550 回答
2

错误消息是不言自明的。

要强制创建新项目,您可以使用切片:

a1 = [5]
a1[1:2] = [12]

如果您不关心元素的顺序,您可以使用字典:

d = {}
d[1] = 12
于 2012-07-18T12:56:24.240 回答
1

如果你真的想要,你可以创建自己的类,当你要求一个不存在的索引时重新定义(并用 填充其余部分None

class mylist():
    def __init__(self,l):
        self.l = l
    def extend(self,index):
        diff = index + 1 - len(self.l)
        if diff > 0:
            self.l.extend([ None for x in range(diff) ] )
    def __getitem__(self,index):
        # self.extend(index) ## depending on your taste
        return self.l[index]
    def __setitem__(self,index,value):
        self.extend(index) 
        self.l[index] = value
    def __repr__(self):
        return self.l.__repr__()

a = mylist([0,1,2,3])
print 'List: %s' % a
# print a[5]  ### this will throw an 'list index out of range' unless you comment out the bit in __getitem__
a[5] = 5
print 'List: %s' % a
print a[5]

哪个输出:

List: [0, 1, 2, 3]
List: [0, 1, 2, 3, None, 5]
5

在http://pythonfiddle.com/auto-dimension-list上查看

这是不完整的,因为您还需要桥接所有其他列表方法,不确定如何做到这一点(可能是一些getattr?)如果某些专家可以加入,那就太好了!

于 2012-07-18T13:17:45.480 回答
0

您应该使用 None 或其他内容预先填充它以添加索引

myList = [None] * 10
myList[1] = 'a'

因为, list 最初是一个 touple,你不能在没有 append 的情况下添加任何东西。

于 2012-07-18T12:47:16.397 回答
0
a1[x] = y

这不可能发生,因为如果列表仅包含 1 项,并且您尝试分配a1[3]它将在列表中的其他两项中分配的内容[1][2]

使用类型的内置方法来修改它们。.append() .insert()

于 2012-07-18T12:49:58.600 回答
0

list.append() 在列表中添加一个元素,并且 a[1] = 'x' 为索引为 1 的列表项分配一些值。您的代码的问题是您试图访问一个不存在的内存块。试试这个。

def a():
    a1=[5, 0] 
    a1[1]=12 
    print a1[1]

或者

def a()
    a1 = list('abc')
    a1[1]=12 
    print a1[1]
于 2012-07-18T12:56:14.803 回答