gpt4 book ai didi

python - 列表理解和类型的副本

转载 作者:太空狗 更新时间:2023-10-30 01:11:23 27 4
gpt4 key购买 nike

在使用列表推导时,我经常想创建一个新列表,因为如果列表很大,这意味着需要更多的空间来计算(我理解列表不是bieng 别名 int his case,为新列表创建了一个新的内存空间)

举个例子(这可以在一行中完成):

def average_list(lst):
lst = [x for x in lst if x > 0]
return np.average(lst)

以这种方式在作业的左右部分使用 lst 是否危险?如果是这样,在什么情况下重用 lst 会导致问题?

如果是这样,为什么这样“更安全”?

def average_list(lst):
clean_lst = [x for x in lst if x > 0]
return np.average(clean_lst )

最佳答案

def average_list(lst):
lst = [x for x in lst if x > 0]
return np.average(lst)

caller_list = [1,4,-5]
average_list(caller_list)
# caller_list is unchanged

在这里,您仅在函数中重用了 lst 名称,但您没有在调用者上下文中更改 lst(并且垃圾回收不起作用,因为调用者仍然持有对数据的引用)

因此,重新分配变量名是完全安全的,但有时被认为是不好的做法,因为不应更改传递参数的值或引用。

注意:在 list 的情况下,一种更改数据本身的方法(这会让您的函数用户感到惊讶,所以不要这样做)将是(仅适用于列表 & 更普遍的 可变对象)

    lst[:] = [x for x in lst if x > 0]

通过这种切片分配,名称不会被重用,对象本身会被重用和修改。列表的原始内容被新内容替换,此处缩小,因为新过滤版本中的数据较少。它在局部变量和全局变量上很酷,但在作为参数传递的列表中应该避免(比如 append,一般情况下也应该避免 pop,始终遵循原则最不惊讶)

关于python - 列表理解和类型的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51050335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com