我有一个查询功能;对于相同的功能,结果可能会有所不同(这是利用随机游走的功能)。
因此相同的参数将产生不同的结果。
我想自动化测试并收集结果(以及失败的结果)。
我写道:
def test_query(function_query,sample=2):
queries = []
tests = sample
failed_tests = 0
while sample > 0 :
query = function_query
if query != None:
queries.append( query )
sample -= 1
else:
failed_tests += 1
# do it again
test_query( function_query,sample)
return queries,tests,failed_tests
queries,failed_tests = test_query( my_f,10)
此代码有效,但我注意到列表查询多次包含对同一对象的引用:
[<networkx.classes.graph.Graph at 0x14c2bacc0>,<networkx.classes.graph.Graph at 0x14c2bacc0>,<networkx.classes.graph.Graph at 0x14c2bacc0>]
相反,如果我在列表中运行查询:
[my_f for _ in range(2)]
我确实获得了不同的对象,请参见参考文献:
[<networkx.classes.graph.Graph at 0x14b206cc0>,<networkx.classes.graph.Graph at 0x14e258668>]
我认为参数function_query
可能传递了相同的引用,因此我尝试通过深度复制传递值,例如:
from copy import deepcopy
def test_query(function_query,sample=2):
function_query = deepcopy( function_query )
queries = []
...
但不起作用。
您能帮助解释这种行为吗?
您能否显示一种编码模式以确保传递的函数“运行”并且所生成的对象被明确引用?
我知道我可以在一开始就声明一个查询样本列表,例如:
def test_query(function_query,sample=2):
queries = [function_query for _ in range(2)]
tests = sample
failed_tests = 0
...
但这意味着样本包括成功的查询和失败的查询。
相反,我希望test_query
在样本测试失败时再次运行查询,以便返回的列表包含所有成功的查询。