所以,我知道如何做到这一点,但它看起来并不像pythonic.这样做有更干净的方法吗?
arr = list(range(10))
print(arr)
for n in range(len(arr)):
# Perform som operation on the element that changes the value "in place"
arr[n] += 1
print(arr)
Run Code Online (Sandbox Code Playgroud)
输出(这就是我想要的):
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
你可以使用列表理解:
arr = [i + 1 for i in arr]
Run Code Online (Sandbox Code Playgroud)
这会产生一个新的清单; 在上面的例子中,我将结果反弹为相同的名称.
如果您对列表有多个引用并且需要就地更改它(因此其他引用会看到更改),请分配标识slice([:])以更新列表的所有索引,而不是重新绑定名称:
arr[:] = [i + 1 for i in arr]
Run Code Online (Sandbox Code Playgroud)
这首先创建一个新的列表对象,然后Python足够聪明,可以看到两个列表的大小相同,并且在再次释放第二个列表之前只复制元素.
在这种情况下,您甚至可以使用生成器表达式来避免创建额外的列表:
arr[:] = (i + 1 for i in arr)
Run Code Online (Sandbox Code Playgroud)
这会将原始元素移到一边为新元素腾出空间,但是没有为此创建新的Python列表对象.这应该是一个小更高效的内存.