ali*_*0.4 5 python pass-by-reference slice python-3.x
如果我有
a = [1, 2, 3]
def foo (arr):
for i in len (arr): arr [i] += 1
def bar (arr):
foo (arr[:2])
bar (a)
print (a)
Run Code Online (Sandbox Code Playgroud)
我想要输出为
>>> [2, 3, 3 ]
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
动机:我想要一个优先级队列,我可以在其中冻结最后一个N元素,即仅传递queue[:N]给heapq.heappush(). 但是,每次我将切片传递给它或任何一般函数时,它都会向函数发送切片的副本而不是实际列表,因此我的列表最终保持不变。
如果 a 是一个数组,这将起作用numpy。默认情况下,numpy切片引用与原始数组相同的内存块。
import numpy as np
a = np.array([1, 2, 3])
def foo(arr):
for i in range(len(arr)): arr[i] += 1
# or just arr += 1
def bar(arr):
foo(arr[:2])
bar(a)
print(a)
# [2, 3, 3 ]
Run Code Online (Sandbox Code Playgroud)
老实说,我不会选择切片,而是只传递索引;
a = [1, 2, 3]
def foo(array, start, stop, jmp= 1):
for idx in range(start, stop + 1, jmp):
array[idx] += 1
def bar(array):
foo(array, 1, 2)
bar(a)
print(a)
[1, 3, 4]
Run Code Online (Sandbox Code Playgroud)