使用python列表理解来修改列表本身,会产生意外的结果吗?

使用python列表理解来修改列表本身,会产生意外的结果吗?,python,list,loops,list-comprehension,Python,List,Loops,List Comprehension,我试图对列表中的每个元素进行适当的更改,并有两种方法:use\u list\u comprehension(a,length)和use\u plain\u loop(a,length)。两者对元素执行相同的操作,但生成不同的结果 我的问题是:python是否先复制a,然后使用该副本作为源来获取元素并对其执行操作? def排列(A): 长度=长度(A) A=使用列表理解(A,长度)#我们得到[19,20,12,1,8] #A=使用循环(A,长度)#我们得到[19,95,12,476,2383] 归

我试图对列表中的每个元素进行适当的更改,并有两种方法:
use\u list\u comprehension(a,length)
use\u plain\u loop(a,length)
。两者对元素执行相同的操作,但生成不同的结果

我的问题是:python是否先复制
a
,然后使用该副本作为源来获取元素并对其执行操作?

def排列(A):
长度=长度(A)
A=使用列表理解(A,长度)#我们得到[19,20,12,1,8]
#A=使用循环(A,长度)#我们得到[19,95,12,476,2383]
归还
def使用列表理解(A,长度):
返回[A[i]+A[A[i]*范围内i的长度(长度)]
def使用普通循环(A,长度):
对于范围内的i(长度):
A[i]+=A[A[i]]*长度
归还
打印(排列([4,0,2,1,3]))

不,列表理解不是复制a,而是创建一个新列表,其中存储在该列表的索引
i
中的值是
a[i]+a[a[i]*长度。因此,
use\u list\u comprehension(A,length)
返回一个新列表,然后在第3行将A设置为该新列表<另一方面,代码>使用循环(A,长度)
实际上修改了列表,因为
A[i]+=A[A[i]]*length
将存储在
A[i]
的值替换为
A[i]+A[A[i]*length

不,列表理解不是制作一个,它正在创建一个新的列表,其中存储在该列表的索引
i
中的值是
a[i]+a[a[i]]*长度
。因此,
use\u list\u comprehension(A,length)
返回一个新列表,然后在第3行将A设置为该新列表<另一方面,代码>使用循环(A,长度)实际上修改了列表,因为
A[i]+=A[A[i]]*length
将存储在
A[i]
的值替换为
A[i]+A[A[i]*length

,非常感谢你,雅各布,给我及时的回答。接下来的一个问题是,
use\u list\u comprehension(A,length)
是否需要O(n)空格,因为它创建了一个新的列表?是的,
use\u list\u comprehension(A,length)
需要O(n)空格。非常感谢雅各布的及时回答。接下来的问题是,
use\u list\u comprehension(A,length)
是否需要O(n)空间,因为它创建了一个新的列表?是的,
use\u list\u comprehension(A,length)
需要O(n)空间。答案不同,因为列表实际上是为
use plain\u loop
修改的,所以当计算下一个值时,它使用更新的值。答案是不同的,因为列表实际上是为
use\u plain\u loop
修改的,所以在计算下一个值时,它使用更新的值。