合并两个排序列表

时间:2015-03-10 20:08:00

标签: python list merge

您好我想问为什么当我在arr下面运行此代码时,没有更改它的值

def merge(arr, left, middle, right):
    newArr = []
    leftCounter = 0
    rightCounter = middle + 1
    while leftCounter <= middle and rightCounter <= right:
        if arr[leftCounter] < arr[rightCounter]:
            newArr.append(arr[leftCounter])
            leftCounter += 1
        else:
            newArr.append(arr[rightCounter])
            rightCounter += 1
    while leftCounter <= middle:
        newArr.append(arr[leftCounter])
        leftCounter += 1
    while rightCounter <= right:
        newArrCounter.append(arr[rightCounter])
        rightCounter += 1
    arr = newArr



def main():
    arr = [1, 5, 7, 2, 4, 6]
    merge(arr, 0, 2, 5)
    print(arr)

结果是[1,5,7,2,4,6]

感谢

2 个答案:

答案 0 :(得分:0)

由于函数内部的变量具有局部范围。您可以在函数中返回arr并将函数结果赋值给变量,在函数的尾随处添加return arr

def main():
    arr = [1, 5, 7, 2, 4, 6]
    new=merge(arr, 0, 2, 5)
    print(new)

但是 note 更改函数内部的可变对象可能会影响调用者!但在这种情况下,您已在newArr结束时将arr分配给arr = newArr,然后您不会更改arr,例如,请参阅以下示例:

>>> def a(arr):
...   arr = [3,4]
>>> x=[5]
>>> a(x)
>>> x
[5]
>>> def a(arr):
...   arr+= [3,4]
... 
>>> a(x)
>>> x
[5, 3, 4]

在第一个状态中,我们已经为名称arr分配了一个新对象,因此python将在函数a的本地名称空间中创建一个局部变量!但在第二种情况下,我们更改了名称arr,而arr是一个可变对象,python不会创建新对象,而是全局更改名称arr

或者您可以将newArr初始化为全局,然后您可以在main函数中打印它:

def merge(arr, left, middle, right):
    global newArr
    newArr = []
    leftCounter = 0
    rightCounter = middle + 1
    while leftCounter <= middle and rightCounter <= right:
        if arr[leftCounter] < arr[rightCounter]:
            newArr.append(arr[leftCounter])
            leftCounter += 1
        else:
            newArr.append(arr[rightCounter])
            rightCounter += 1
    while leftCounter <= middle:
        newArr.append(arr[leftCounter])
        leftCounter += 1
    while rightCounter <= right:
        newArrCounter.append(arr[rightCounter])
        rightCounter += 1
    arr = newArr

def main():
    arr = [1, 5, 7, 2, 4, 6]
    merge(arr, 0, 2, 5)
    print(newArr)

答案 1 :(得分:0)

简单地说,当你将arr传递给函数时,它会在内存中引用一个列表,但它的与函数外的arr不一样的引用(即使他们指的是同一个对象)。在功能中,当你有

arr = newArr

基本上你有新的对象的函数范围引用点,但不是函数外的引用。

http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/

如果你在函数中 mutate arr,因为它们引用同一个对象,函数外部的引用仍将引用变异对象。