【问题标题】:Python same list gets altered by one function and not altered by anotherPython 相同的列表被一个函数更改,而不被另一个函数更改
【发布时间】:2016-07-12 22:22:27
【问题描述】:

我已经阅读了很多关于可变对象的修改将如何反映在函数之外的 SO 页面,但不可变对象(显然)不会。但是我对这段代码有点困惑,我将相同的列表发送到两个不同的排序函数,一个会修改它,另一个不会。

def bubbleSort(mylist):
    for i in range(len(mylist)):
            for j in range(i,len(mylist)):
                    if mylist[i] > mylist[j]:
                            mylist[i], mylist[j] = mylist[j], mylist[i]
    return mylist

上面的bubbleSort()可以这样调用:

bubbleSort(mylist)

它工作得很好,mylist 的 midification 反映在调用者中。您可以完全忽略调用者中 bubbleSort() 的返回值。

def mergeSort(mylist):
    listSize = len(mylist)
    shortSize = int(listSize/2)
    if listSize == 1:
            return (mylist)
    mylistLeft = mergeSort(mylist[:shortSize])
    mylistRight = mergeSort(mylist[shortSize:])
    i, j = 0, 0
    result = []
    while (i < len(mylistLeft) and j < len(mylistRight)):
            if mylistLeft[i] > mylistRight[j]:
                    result.append(mylistRight[j])
                    j += 1
            else:
                    result.append(mylistLeft[i])
                    i += 1
    result += mylistRight[j:]
    result += mylistLeft[i:]
    return result

这里的mergeSort()不能像上面那样调用。相反,我必须这样称呼它:

newlist = mergeSort(mylist)

newlist 有我想要的,而 mylist 有未排序的列表。所以 bubbleSort() 不需要 return 语句,而 mergeSort() 没有它就毫无用处。我理解递归返回的必要性,但我期望不必在调用函数中使用返回值。

所以我的问题是,有什么区别?在这两种情况下变量不是可变的吗?

【问题讨论】:

    标签: python-2.7 variables parameter-passing


    【解决方案1】:

    您的mergeSort 函数根本不会修改传入的列表。它会创建一个新列表。

    results = [] 创建一个全新的空列表。然后你将元素附加到它。这些都不会修改您传入的原始列表。

    编辑

    顺便说一句,确实可以“就地”执行合并排序(通过修改原始列表而不是创建新列表),但这有点棘手。作为一种通用技术,您希望继续传递原始列表,但使用索引来标记每个递归调用应该对列表的哪个部分进行操作。

    【讨论】:

    • 哦,好的。所以我在从 mergoSort() 返回之前尝试了 mylist = result。但是还是不行。
    • 这也不会修改原始列表。它只是更改变量 mylist 指向的内容。例如,尝试def foo(x): x = 5,然后尝试a = 4; foo(a)。这不会修改 a 的值。
    • 好的,现在我很好奇,你能给我指出一个好的教程吗?描述性越强越好。
    • @Deedaus 给robertheaton.com/2014/02/09/… 一个机会?
    • 您的示例不起作用,因为 a 是可变的,对吗?所以 foo 使用不同的对象。但据我所知,我的清单不是。请原谅我不断的追问。我来自 C++ 或更低级别的背景,这些东西正在煎熬我的大脑。顺便说一句,我已经很喜欢这个链接了,谢谢伙计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2017-01-24
    • 2016-10-31
    • 1970-01-01
    • 2021-03-19
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多