为什么在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.insertlist.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