3

我有以下代码:

def radixSort(A):

    #get max amount of digits

    A = sortByDigit(A, maxDigits) #this works
    print(A) #prints A as sorted

if __name__ == "__main__":
    A = [int(100*random.random()) for i in range(10)]
    radixSort(A)
    print(A) #prints unsorted

为什么更改 radixSort 中的 A 不会更改 main 方法中的 A ?我意识到我可以简单地在 radixSort 中添加一个 return 语句,并在 main 方法中添加一个赋值语句,但是代码必须通过以下测试用例:

    def testrRadixSort(self):
        A = [4, 3, 2]
        radixSort(A)
        self.assertEqual(A, [4,3,2])
4

5 回答 5

4

sortByDigit没有就地排序。它正在创建一个新列表并返回对该列表的引用。

您可以A通过这个简单的更改将 的内容替换为新列表的内容

A[:] = sortByDigit(A, maxDigits) #this works

或者,您可以进行修改sortByDigit,使其就地排序

于 2013-10-28T01:38:41.847 回答
1

问题出在这一行:

A = sortByDigit(A, maxDigits)

您创建了 的本地分配A,它不会覆盖 的全局副本A

您需要sortByDigit修改 的内容A,而不是返回新列表。

另一种方法是添加

global A

在该行之前,它将修改全局A.

然而,关于全局变量,请参阅下面的 kindall 评论。

于 2013-10-28T01:37:24.033 回答
0

这种行为是关于通过引用或值传递参数。StackOverflow 上已经对这种行为进行了很好的解释

这意味着:您不能重新分配给定的列表,但您可以修改现有实例,例如使用append方法。

于 2013-10-28T01:36:48.487 回答
0

我假设sortByDigit()返回列表的排序副本,而不是对其进行排序。在这种情况下,只需通过切片分配将该列表的内容替换为该调用的结果:

A[:] = sortByDigit(A, maxDigits)
于 2013-10-28T01:38:11.513 回答
0

不,你不能那样改变A。请记住,A您的radixSort功能(本地范围)与A您的主要功能(全局范围)不同。

为了实现您的需要,您可以将其声明为全局变量。但是,这不是最好的方法,因为使用全局变量会使您遇到令人困惑的范围问题,因此不建议这样做。但这是如何做到的:

def radixSort(lst): #we can refer to the passed variable as lst
    global A

这不会对 A 进行就地排序,而是将排序分配lstA.

A或者更好的是,使用切片表示法将排序值分配给:

A[:] = sortByDigit(A, maxDigits) #store the sorted list in A

或者更好的是,将其按排序返回,然后A使用排序后的值重新分配:

def radixSort(A):

    #get max amount of digits

    A = sortByDigit(A, maxDigits) #this works
    print(A) #prints A as sorted
    return A

在你的主程序中:

if __name__ == "__main__":
    A = [int(100*random.random()) for i in range(10)]
    A = radixSort(A)
    print(A) #prints sorted
    self.assertEqual(A, [4,3,2]) #self.assertEqual(sorted, unsorted)

此外,将标识符大写并不是一个好习惯。大写的单词通常是为类保留的。

所以:

def radixSort(a):

    #get max amount of digits

    a = sortByDigit(a, maxDigits) #this works
    print(a) #prints A as sorted
    return a

if __name__ == "__main__":
    a = [int(100*random.random()) for i in range(10)]
    a = radixSort(a)
    print(a) #prints sorted
    self.assertEqual(A, [4,3,2]) #self.assertEqual(sorted, unsorted)

希望这可以帮助!

于 2013-10-28T01:54:18.547 回答