【发布时间】: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