我有以下代碼:
def recursive_sort(list_to_sort, key):
"""
sort a list by a specified key recursively
"""
if len(list_to_sort) == 1:
return list_to_sort
for i in range(0,len(list_to_sort) - 1):
if list_to_sort[i][key] > list_to_sort[i + 1][key]:
list_to_sort[i], list_to_sort[i+1] = list_to_sort[i+1], list_to_sort[i]
return recursive_sort(list_to_sort[:-1], key) + [list_to_sort[-1]]
我在 main() 中使用以下命令運行它:
sensor_list = [('4213', 'STEM Center', 0), ('4201', 'Foundations Lab', 1), ('4204', 'CS Lab', 2), ('4218', 'Workshop Room', 3), ('4205', 'Tiled Room', 4), ('Out', 'Outside', 10)]
print("\nOriginal unsorted list\n", sensor_list)
print("\nList sorted by room number\n", recursive_sort(sensor_list, 0))
print("\nList sorted by room name\n", recursive_sort(sensor_list, 1))
print("\nOriginal unsorted list\n", sensor_list)
這將打印輸出:
Original unsorted list
[('4213', 'STEM Center', 0), ('4201', 'Foundations Lab', 1), ('4204', 'CS Lab', 2),
('4218', 'Workshop Room', 3), ('4205', 'Tiled Room', 4), ('Out', 'Outside', 10)]
List sorted by room number
[('4201', 'Foundations Lab', 1), ('4204', 'CS Lab', 2), ('4205', 'Tiled Room', 4),
('4213', 'STEM Center', 0), ('4218', 'Workshop Room', 3), ('Out', 'Outside', 10)]
List sorted by room name
[('4204', 'CS Lab', 2), ('4201', 'Foundations Lab', 1), ('Out', 'Outside', 10),
('4213', 'STEM Center', 0), ('4205', 'Tiled Room', 4), ('4218', 'Workshop Room', 3)]
Original unsorted list
[('4204', 'CS Lab', 2), ('4201', 'Foundations Lab', 1), ('4213', 'STEM Center', 0),
('4205', 'Tiled Room', 4), ('Out', 'Outside', 10), ('4218', 'Workshop Room', 3)]
為什麼第一次和第四次打印返回不同的列表,sensor_list 不應該保持不變嗎?
正如@PresidentJamesK.Polk 所提到的,這稱為就地修改。這意味著無論你對參數/變量做什麼,它都會在函數之外修改它。發生這種情況是因為您正在修改參數本身而不是將其複製到列表中。為了防止這種情況,在你的函數中你可以說:
def recursive_sort(list_to_sort, key):
result = list_to_sort.copy() # Or just regular assignment, but this is guaranteed to prevent in-place modification
# Subsequent code with 'list_to_sort' replaced with result so
# that it modifies the new, copied variable instead of the original
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句