Python 索引和列表-索引超出范围

Python 索引和列表-索引超出范围,python,list,Python,List,下面的代码不应该打印吗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

下面的代码不应该打印吗<代码>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]
行中列出分配索引超出范围的错误,但前面的行成功打印
100
。price[i]是否应该简单地获取指定的price[0]值?

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

somelist=[]
somelist[0]=1
索引器
所以只需使用
append

范围(1,3)内的i的
:
price.append(价格[i-1])

如果您只是尝试附加到列表中,那么尝试使用索引执行此操作将无法正常工作,因为该索引不在列表中:

somelist=[]
somelist[0]=1
索引器
所以只需使用
append

范围(1,3)内的i的
:
price.append(价格[i-1])

问题是您分配的索引对于数组的长度来说太大了

对于范围(1,3)内的i:

这将i初始化为1。由于数组的索引为零,并且在第一次传递时数组的长度为1,因此您将在您提到的行(当
i=1
时)遇到
赋值超出范围错误

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

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

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

对于范围(1,3)内的i:

这将i初始化为1。由于数组的索引为零,并且在第一次传递时数组的长度为1,因此您将在您提到的行(当
i=1
时)遇到
赋值超出范围错误

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

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

无法直接为列表指定值,因为此列表已定义注释的先前大小。必须使用append将元素添加到所需的位置

检查:

#检查初始位置上的值
打印(价格[0])
对于范围(1,3)内的i:
price.append(价格[i-1])
打印(价格[i])

您不能直接为列表赋值,为什么此列表定义了以前的注释大小。必须使用append将元素添加到所需的位置

检查:

#检查初始位置上的值
打印(价格[0])
对于范围(1,3)内的i:
price.append(价格[i-1])
打印(价格[i])

无法打印出来:

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])
您使用1个元素初始化了一个列表,该列表的大小为1。然而,对于
for
循环,范围从1开始,实际发生的情况是:

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

for i in range(1, 3): # The list is 0-indexed, meaning price[0] contains 100
    print(price[0]) # prints 100 as it should
    price[i] = price[i - 1] # i is 1, price[i] is not an assigned value, i.e: you never assigned price[1]
    price.append(price[i]) # This doesn't execute because an exception was thrown
    print(price[i]) # Neither does this
要获得您想要的结果,这将起作用:

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

for i in range(0, 2): # Start at index 0
    print(price[i]) # Print current index
    price.append(price[i]) # Append current value of price[i] to the price list
要确保所有附加内容都符合预期,您可以使用len进行测试:

print(len(price))

输出:3


但是,这是@smci在其答案中显示的一种首选附加方式。

不会打印出来:

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])
您使用1个元素初始化了一个列表,该列表的大小为1。然而,对于
for
循环,范围从1开始,实际发生的情况是:

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

for i in range(1, 3): # The list is 0-indexed, meaning price[0] contains 100
    print(price[0]) # prints 100 as it should
    price[i] = price[i - 1] # i is 1, price[i] is not an assigned value, i.e: you never assigned price[1]
    price.append(price[i]) # This doesn't execute because an exception was thrown
    print(price[i]) # Neither does this
要获得您想要的结果,这将起作用:

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

for i in range(0, 2): # Start at index 0
    print(price[i]) # Print current index
    price.append(price[i]) # Append current value of price[i] to the price list
要确保所有附加内容都符合预期,您可以使用len进行测试:

print(len(price))

输出:3


但是,正如@smci在其回答中所示,这是一种首选的附加方式。

您试图将项目附加到列表中,或者更准确地说,是使用重复的内容副本初始化列表。以下是Pythonic的方法:

# 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对初学者来说是更好的练习。)

你正在尝试将项目附加到列表中,或者更准确地说,用某个事物的重复副本初始化列表。以下是Pythonic的方法:

# 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是更好的做法。)

问题是在尝试访问python[i]时,然后它将索引抛出范围之外。Left语句甚至未进行
计算
您试图将项目附加到列表中,请参见下文。您不能只在不存在的索引位置分配一个值,然后期望列表自动追加或增长自身。(顺便说一句,如果您事先知道列表将至少有3个元素,您可以将其初始化为
price=[None]*3
,您将得到
[None,None,None]
。现在您可以直接分配给它们。但是,显式地执行append是更好的做法。)问题是当尝试访问python[i]时,它会将索引抛出范围之外。Left语句甚至未进行
计算
您试图将项目附加到列表中,请参见下文。您不能只在不存在的索引位置分配一个值,然后期望列表自动追加或增长自身。(顺便说一句,如果您事先知道列表将至少有3个元素,您可以将其初始化为
price=[None]*3
,您将得到
[None,None,None]
。现在您可以直接分配给它们。但是,显式地执行追加是更好的做法。)