Python如何将列表作为参数并编辑其值?

时间:2013-10-28 01:34:11

标签: python list parameters

我有以下代码:

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不会改变A?我意识到我可以在radixSort中添加一个return语句,在main方法中添加一个赋值语句,但代码必须通过以下测试用例:

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

5 个答案:

答案 0 :(得分:4)

sortByDigit未进行排序。它正在创建一个新列表并返回对它的引用。

您可以使用此简单更改

替换A的内容和新列表的内容
A[:] = sortByDigit(A, maxDigits) #this works

或者您可以修改sortByDigit,以便它进行排序

答案 1 :(得分:1)

问题在于这一行:

A = sortByDigit(A, maxDigits)

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

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

另一种方法是添加

global A

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

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

答案 2 :(得分:0)

此行为是通过引用或值传递参数。 StackOverflow上已存在great explanation此行为。

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

答案 3 :(得分:0)

我假设sortByDigit()返回列表的排序副本,而不是将其排序。在这种情况下,只需通过切片分配:

将该列表的内容替换为该调用的结果
A[:] = sortByDigit(A, maxDigits)

答案 4 :(得分:0)

不,你不能那样改变A。请注意,A函数(本地范围)中的radixSort与主函数(全局范围)中的A不同。

要实现您的需求,您可以将其声明为全局变量。但是,这不是最好的方法,因为使用全局变量会使您陷入混乱的范围问题,因此不建议这样做。但是这个怎么做:

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

这不会对A进行排序,但会将已排序的lst分配给A

或者更好的是,使用切片表示法将排序后的值分配给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)

希望这有帮助!