我在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&# 39;我喜欢这样:
foo(["A", "B", "X", "Y", "Z"], SomeClass("m", arg1), SomeClass("n", arg1))
因此代码更短,更易读。我应该用什么来代替arg1以便"引用"第一个参数传递给foo?
答案 0 :(得分:4)
为什么不使用变量:
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()或{{3 }}:
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()
返回深层副本。有关list slicing
答案 1 :(得分:2)
不,没有这样的参考;你传入了一个列表文字对象,除了内部解释器堆栈之外,没有其它的引用。
只需创建自己的参考;将第一个列表存储在变量 first 中,然后引用:
arg1 = ["A", "B", "X", "Y", "Z"]
foo(arg1, SomeClass("m", arg1), SomeClass("n", arg1))
如果foo()
总是需要基于SomeClass()
的多个arg1
个实例,您还可以让foo()
负责创建那些情况。仅将那个其他参数传递给SomeClass()
:
foo(["A", "B", "X", "Y", "Z"], "m", "n")
和foo
:
def foo(arg1, *arg2_values):
instances = [SomeClass(arg1, arg2) for arg2 in arg2_values]
现在调用者只需要传入一次该列表。