首页 > 解决方案 > 如果我之前对函数的列表参数进行切片,为什么切片分配只能就地工作?

问题描述

对于我正在学习的 Python 课程,我们被分配使用就地算法反转提供的字符串列表。虽然这可以通过直接交换索引来完成,但我看到这种方式并没有考虑向列表中添加更多字符串,并且如果发生这种情况需要额外的编码。

我对解决方案的第一枪看起来像:

words = ['this' , 'is', 'a', 'sentence', 'reverse', 'me']
def function_1(a_list):
    a_list = a_list[::-1]
    print(a_list) #Used this to show it is indeed reversed inside of the function
    return a_list

function_1(words)
print(words)

当它运行时,当在函数内部而不是在函数外部调用时,列表会反转。

我想看看我是否可以让它真正影响函数之外提供的列表,我最终得到:

words = ['this' , 'is', 'a', 'sentence', 'reverse', 'me']
def function_2(a_list):
    a_list[:] = a_list[::-1] 
    print(a_list) #Used this to show it is indeed reversed inside of the function
    return a_list

function_2(words)
print(words)

使用第二个函数,实际上更改了字符串(单词),我认为我的就地算法分配已完成。但是为什么它只发生在第二个函数中呢?它是真的就地发生还是比看起来正在发生的事情发生得更多?

标签: pythonin-place

解决方案


当您在方法内进行赋值时,a_list现在指向一个新位置中的列表,该位置仅存在于方法范围内。一旦您a_list在方法内对名称进行了赋值,您现在正在编辑一个在方法外不存在的变量,并且基本上失去了对原始的访问权限a_list:方法中的任何未来引用a_list都不会指向得到的参数通过了。

因此,您应该对内存中的原始数组进行索引分配,这就是您所做的。这将持续存在,因为您直接在原始变量中分配值。


推荐阅读