索引和列表索引超出范围

2024-06-16 18:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码不应该打印吗?100 100

price = 100  # assigns 'price' reference to 100
price = [price] # creates a 'price' list with 1 element: [100]

for i in range(1, 3):
    print(price[0]) # prints 100
    price[i] = price[i - 1]
    price.append(price[i])
    print(price[i])

在第price[i] = price[i - 1]行获取IndexError: list assignment index out of range错误,但前面的行成功打印了100。price[i]不应该只是获得指定的price[0]值吗?你知道吗


Tags: to代码inforwithrangeelementprints
3条回答

如果您只是尝试附加到列表中,那么尝试使用索引执行此操作将不会完全起作用,因为该索引不在列表中:

somelist = []
somelist[0] = 1
IndexError

所以就用append

for i in range(1,3):
    price.append(price[i-1])

问题是,您分配的索引对于数组的长度来说太大了。你知道吗

for i in range(1, 3):

这会将i初始化为1。由于数组是零索引的,并且数组的长度在第一次遍历时是1,因此您将在您提到的行中找到一个assignment out of range error(当i=1)。你知道吗

下面是一个显示问题的最小示例:

my_array = ["foo"]
my_array[1] = "bar" # throws assignment out of range error

您正在尝试将项附加到列表中,或者更准确地说是使用某个内容的重复副本初始化列表。以下是一些Python式的方法:

# Use a list comprehension
>>> price = [100 for _ in range(3)]
[100, 100, 100]

# Use itertools.repeat
>>> import itertools
>>> list(itertools.repeat(100, 3))
[100, 100, 100]

它们都比(重复地)做append()要快,这是O(N),所以重复做append()是长列表上的O(N^2),这会变得非常慢。你知道吗

(顺便说一句,如果你事先知道列表至少有N个元素,并且N很大,你可以将它初始化为price = [None] * N,然后得到[None, None, None...]。现在你可以直接分配给他们。但是,对于初学者来说,显式地执行append是更好的练习。)

相关问题 更多 >