我在 Python 中有这样一个函数调用:
foo(["A", "B", "X", "Y", "Z"], SomeClass("m", ["A", "B", "X", "Y", "Z"]), SomeClass("n",["A", "B", "X", "Y", "Z"]))
一般来说,foo 可以有任意数量的参数,所以可以传递很多 SomeClass 对象,但是在调用构造函数时,你总是必须传递与 foo 的第一个参数相同的东西,What I'我想要的是这个:
foo(["A", "B", "X", "Y", "Z"], SomeClass("m", arg1), SomeClass("n", arg1))
所以代码更短,更易读。为了“引用”传递给 foo 的第一个参数,我应该用什么代替 arg1?
请您参考如下方法:
为什么不使用变量:
arg1 = ["A", "B", "X", "Y", "Z"]
foo(arg1, SomeClass("m", arg1), SomeClass("n", arg1))
注意:列表通过引用传递,因此如果您在 foo 中修改它或在初始化 SomeClass 时,您可能会得到不可预知的结果以避免这种情况你必须通过列表的副本,查看更多信息How to clone or copy a list?问题。
要解决引用问题,您必须在将列表传递给 SomeClass 或 foo 之前复制列表,这可以用 copy.copy() 来完成, copy.deepcopy()或 list slicing :
from copy import copy, deepcopy
foo(copy(arg1), SomeClass("m", copy(arg1)), SomeClass("n", copy(arg1)))
foo(arg1[:], SomeClass("m", arg1[:]), SomeClass("n", arg1[:]))
foo(deepcopy(arg1), SomeClass("m", deepcopy(arg1)), SomeClass("n", deepcopy(arg1)))
重要的时刻是列表切片 ([:]) 和 copy.copy() 同时返回列表的浅拷贝 copy.deepcopy() 返回深拷贝。查看更多信息 What exactly is the difference between shallow copy, deepcopy and normal assignment operation?
