python - 如果我之前对函数的列表参数进行切片,为什么切片分配只能就地工作?
问题描述
对于我正在学习的 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)
使用第二个函数,实际上更改了字符串(单词),我认为我的就地算法分配已完成。但是为什么它只发生在第二个函数中呢?它是真的就地发生还是比看起来正在发生的事情发生得更多?
解决方案
当您在方法内进行赋值时,a_list
现在指向一个新位置中的列表,该位置仅存在于方法范围内。一旦您a_list
在方法内对名称进行了赋值,您现在正在编辑一个在方法外不存在的变量,并且基本上失去了对原始的访问权限a_list
:方法中的任何未来引用a_list
都不会指向得到的参数通过了。
因此,您应该对内存中的原始数组进行索引分配,这就是您所做的。这将持续存在,因为您直接在原始变量中分配值。
推荐阅读
- javascript - 仅使用 Trirand Jqgrid (ASP.NET WebForms v5.2) 保留列排序和搜索过滤器?
- sql - 获取一行中每个值的百分比
- wordpress - get_the_category() wordpress 函数在更新核心版本后停止工作
- ruby - 使用 ruby 抓取动态内容
- c# - C# ASP.NET 错误响应不使用 GlobalConfiguration.Configuration.Formatters 设置
- c - 在不使用 AUTOCONF 的情况下,如何准确地找出 C 编译器支持的说明符(如果有):inline、__inline__ 或 __inline?
- html - 为什么 bootstrap 3 行不扩展以适应内容?
- php - 试图用 spout 写日期单元格
- docker - 使用 sshd 进行测试的 docker
- docker - Calicoctl 错误:“bash: /usr/local/bin/calicoctl: Permission denied ubuntu