对这个Python函数中的引用传递感到困惑

时间:2016-09-01 22:59:26

标签: python python-2.7

我有这个简单的Python 2.7函数:

SimpleRabbitListenerContainerFactoryConfigurer

然而,当我跑步时:

def sort_rows(mat): 
    mat = [sorted(i) for i in mat]

我得到了

M = [[4, 5, 2, 8], [3, 9, 6, 7]]
sort_rows(M)
print(M)

为什么没有编辑[[4, 5, 2, 8], [3, 9, 6, 7]] ?我以为python函数通过引用传递列表?我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

当您sort_rows被调用时,mat指向M指向的同一列表。但是,这一陈述改变了:

mat = [sorted(i) for i in mat]

执行上述操作后,mat现在指向不同的列表。 M未更改。

要更改M

>>> def sort_rows(mat): 
...     for i, row in enumerate(mat):
...         mat[i] = sorted(row)
... 
>>> sort_rows(M)
>>> M
[[2, 4, 5, 8], [3, 6, 7, 9]]

语句mat[i] = sorted(row)更改mat的第i个元素,但不会更改mat指向的列表。因此,M也会发生变化。

或者,您可以让函数返回包含已排序行的列表:

>>> def rowsort(mat):
...     return [sorted(i) for i in mat]
... 
>>> M = [[4, 5, 2, 8], [3, 9, 6, 7]]
>>> M = rowsort(M)
>>> M
[[2, 4, 5, 8], [3, 6, 7, 9]]

答案 1 :(得分:0)

原因是sorted函数没有对列表进行排序,如果要对其进行排序,可以使用list.sort()方法:

def sort_rows(mat): 
    [i.sort() for i in mat]

M = [[4, 5, 2, 8], [3, 9, 6, 7]]
sort_rows(M)
print(M)

# [[2, 4, 5, 8], [3, 6, 7, 9]]

sorted会返回一个新列表,但原始列表不会更改:

x = [3, 2, 1, 4]

sorted(x)
# [1, 2, 3, 4]

x
# [3, 2, 1, 4]                  # x doesn't change here

答案 2 :(得分:0)

您可以使用return函数在排序行的末尾返回变量mat。

return M

然后,如果你尝试 -

print(sort_rows(M))

你应该得到你想要的结果。感谢。

答案 3 :(得分:0)

您可以使用return函数在排序行的末尾返回变量mat。

返回M

然后,如果你尝试

打印(sort_rows(M))

你应该得到你想要的结果。

我的意思是回复我道歉