利用 python 对可变数据结构(如列表)的传递共享是否符合习惯?

Is it idiomatic to take advantage of python's pass-by-sharing of mutable data structures like lists?

我知道在 Python 中,因为它是传递共享,如果我将一个可变对象(如列表)传递给一个函数,然后使用该函数来改变它,我不会不需要显式传回,因为调用者可以看到变化:

def add_to_list(list_of_nums):
    list_of_nums.append(26)

my_list = [12]
add_to_list(my_list)
print my_list  # >>>[12, 26]

所以这行得通。但这是一个很好的 idea/good python 做法吗?我的直觉告诉我它不是(就像全局变量几乎总是一个坏主意一样),但也许这只是因为我第一次学习 C++ 是因为它的所有按值传递的荣耀。

是的,我知道我可以通过编写代码来解决这个问题(比如创建一个 class),但问题是,我应该这样做吗?或者这通常被视为可以接受的做法吗?

我认为这是否是 "acceptable" 将取决于上下文和函数命名的好坏程度。牢记 Pep 20:"Explicit is better than implicit."

Python 完全支持函数式编程,在那种情况下,修改传入的对象通常是意料之中的。如果该函数命名得当并且记录良好,我认为它很好。你的例子很好地说明了这一点。该函数称为 add_to_list,它非常明确地说明了该函数的作用。

如果您的 program/script 更多地采用面向对象的方法,则应该通过创建适当的 classes 来代替修改传入的对象,就像本机 list class 在您的示例中 - 它有一个 append() 方法来修改列表而不是将列表传递给单独的函数。

关键是要与您的范例保持一致并有据可查。如果你涵盖这两个基础,我认为它是可以接受的。