Python 将list/dict作为参数传递给函数,与直接在函数中修改它相比,有什么优点/缺点吗?

Python 将list/dict作为参数传递给函数,与直接在函数中修改它相比,有什么优点/缺点吗?,python,Python,这样做有什么好处或坏处吗 listtt =[1] dicto = {'a':2} def ffun(): listtt.append(2) dicto['b'] = 3 ffun() print(listtt) print(dicto) [1,2] {'a':2,'b':3} 对这个 listtt =[1] dicto = {'a':2} def ffun(hh, hh2): hh.append(2) hh2['b'] = 3 ffun(listtt,

这样做有什么好处或坏处吗

listtt =[1]
dicto = {'a':2}

def ffun():
    listtt.append(2)
    dicto['b'] = 3

ffun()
print(listtt)
print(dicto)
[1,2] {'a':2,'b':3}

对这个

listtt =[1]
dicto = {'a':2}

def ffun(hh, hh2):
    hh.append(2)
    hh2['b'] = 3

ffun(listtt, dicto)
print(listtt)
print(dicto)
[1,2] {'a':2,'b':3}

*嗨

我可能过分简化了这一点,但即使是以非常高的音量传递dict和list,那么您所拥有的也不会引起任何问题。Python通过对象引用传递参数,所以没有内存操作,在这两种情况下性能应该相同。
话虽如此,您仍然需要重新考虑为什么首先需要全局变量。Kaya已经在评论中链接了关于全局变量的讨论。值得快速阅读*

传入对象让调用者知道“可能发生的事情”——希望方法级文档能够解释其余部分(在这两种情况下都有副作用)。因此,在许多情况下,“更好”;调用方被迫做出相关选择,因此操作更加透明。在这种情况下,由于变量稍后会在调用方中使用,因此它只会添加代码分歧以在函数中隐式访问全局变量。(有人可能会说,更大的问题是不使用对象作为容器,或者通常不使用变异,以及..离题..不管怎样,想想孩子们。)第二个函数可以修改您给它的任何列表/目录,而不仅仅是名为
listtt
等的列表/目录。Python不使用按引用传递,但是你的答案是正确的。我已经编辑了,提到了通过对象引用传递,如果你清楚地阅读了我的答案,我提到我正在简化答案,以满足所问问题的需要,python是如何传递的,细节已经在很多问题中出现。ThanksNote:如果名称被重复引用,全局的性能实际上会更差;全局查找/存储需要一个
dict
查找,而函数局部变量(包括参数)是一个运行速度明显更快的C级数组查找。简化是好的,指出一些简单的错误是另一个问题