我有以下代码:
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])
答案 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)
希望这有帮助!