繁体   English   中英

合并两个排序列表

[英]Merge two sorted lists

您好,我想问为什么当我在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]

谢谢

由于函数内部的变量具有局部作用域,因此您可以在函数中返回arr并将函数结果分配给变量,请在函数末尾添加return arr

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

但是请注意 ,在函数内部更改可变对象可能会影响调用者! 但是在这种情况下,您必须在arr = newArr的末尾将newArr分配给arr ,然后不更改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初始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)

简而言之,当您将arr传递给函数时,它引用的是内存中的列表,但与函数外部的arr 引用不同 (即使它们引用的是同一对象)。 在功能中,当您有

arr = newArr

本质上,您具有指向新对象的功能范围引用点,但没有功能外部的引用。

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

如果您在函数内对arr进行了突变 ,则由于它们引用的是同一对象,因此函数外的引用仍将引用该突变的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM