gpt4 book ai didi

python - 将列表对象作为函数参数传递(而不是作为默认值),是否有任何陷阱?

转载 作者:太空宇宙 更新时间:2023-11-03 15:10:26 26 4
gpt4 key购买 nike

不知道我在哪里读到这个建议,但如果我需要将值序列作为函数参数传递,我会使用元组。我这样做可能是因为它是不可变的,并且有人建议我通过阅读一些书籍或通过类(class)来这样做。但现在我需要一个函数,其中列表应作为参数传递(因为我需要在其中使用 pop )。现在,当我比以前更有经验时,我只是想知道,将列表作为函数参数传递是否存在任何问题?

我知道使用列表作为默认值 - 不是一件好事。但简单的论证又如何呢?之后是否会发生任何问题,或者我应该遵循的唯一规则 - 不要使用列表作为参数默认值?

例如,做这样的事情 - 并不是一件好事:

def hello(arg_string="abc", arg_list = []): 
print arg_string, arg_list
arg_string = arg_string + "defg"
arg_list.append("A")


for i in range(4):
hello()

输出为

abc [] 
abc ['A']
abc ['A', 'A']
abc ['A', 'A', 'A']

但是,如果我想要一些简单的东西,无论是否更改对象,但我在哪里可以确定我可以记录我更改了某些内容:

def hello(arg_list = []): 
for i in arg_list:
print(i)


hello(["1","2","3"])

这里的输出是:

1
2
3

最佳答案

如果将可变对象传递给函数,该函数可以更改内容:

l = [1, 2, 3]

def bad_func(lst):
lst.append(5)
return lst

l2 = bad_func(l)
print(l) # [1, 2, 3, 5]
print(l2) # [1, 2, 3, 5]

通常函数应该表明它们是否改变输入,因此只有当函数没有或只有糟糕的文档时,这可能才成为问题。

但是,如果更改输入,您始终可以传入副本或在函数中进行复制:

def well_behaved_func(lst):
lst = lst[:] # shallow copy because the function alters the input
lst.append(5)
return lst

l = [1, 2, 3]
l2 = well_behaved_func(l)
print(l) # [1, 2, 3]
print(l2) # [1, 2, 3, 5]

根据经验(也有异常(exception)),函数应该仅在不返回任何内容时修改输入 - 或者如果确实返回某些内容,则应保留输入。

关于python - 将列表对象作为函数参数传递(而不是作为默认值),是否有任何陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246657/

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