在同一个调用中引用函数参数

时间:2016-08-10 12:42:37

标签: python

我在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?

2 个答案:

答案 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?问题的详细信息。

要修复参考问题,您必须在将列表传递到SomeClassfoo之前复制列表,可以使用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]

现在调用者只需要传入一次该列表。