Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在python中将值分配给列表时会出现错误?_Python - Fatal编程技术网

为什么在python中将值分配给列表时会出现错误?

为什么在python中将值分配给列表时会出现错误?,python,Python,不是按列表追加值。追加到列表中,为什么可以;我不能这样给它赋值吗 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() ----------

不是按列表追加值。追加到列表中,为什么可以;我不能这样给它赋值吗

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
a=[5]创建一个大小为1的列表。以下各项有效:

a[0] = 1
但是,您不能仅仅通过给给定的、不存在的位置赋值来改变列表的大小

不过,您可以使用append或+=,扩展列表:

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

a = [0] * 4
这会给你一个四个元素都是零的列表。在此之后,您可以更改0-3范围内的任何元素


作为参考,这里有一些来自python.org的内容。

您应该预先用None或添加索引的内容填充它

myList = [None] * 10
myList[1] = 'a'
因为,list最初是一个touple,没有append就不能添加任何内容

a1[x] = y
这是不可能发生的,因为如果列表仅包含1项,而您尝试分配a1[3]它将在列表中的其他两个[1][2]项中分配什么


使用类型的内置方法对其进行修改。append.insert

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

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


错误消息是不言自明的

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

a1 = [5]
a1[1:2] = [12]
如果您不关心元素的顺序,可以使用字典:

d = {}
d[1] = 12

如果您真的想要,您可以创建自己的类,当您请求一个不存在的索引时,该类可以重新定义维度,而其余的则不包含索引

哪些产出:

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


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

您可以分配给列表中的现有项,但不能使用分配在Python中添加新项。有什么确切的原因吗?或者这只是一条规则?@Nilesharma:有很多很好的理由不允许分配给不存在的单元格。最明显的是避免一类重要的bug。@Nilesharma:想想这个例子-a=[1];a[4]=5。元素1、2和3应该做什么?Python不需要猜测这些元素的合理默认值。它还经常避免特殊的大小写,在这里,分配给列表中的下一个元素是一种特殊情况,因为它会导致更干净的代码。@Nilesharma这只是一个设计决策。Python的设计者可以选择允许将元素插入不存在的位置。例如,如果有任何缺口,可以不填补。但是,在我看来,他们实际选择的方式更有意义。
d = {}
d[1] = 12
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