如何将乘法字典作为函数参数传递?一本为参考,一本为复印件
How to pass multiply dictionaries as function arguments? One dict as reference and one as a copy
我有一个功能需要两本词典,一本作为副本,一本作为参考。
我明白了。
_start_value = 0.00724
_second_value = 42700.0
_result = 0.0
_delta = 0.0
data1 = {'start_value':_start_value, 'second_value': _second_value }
data2 = {'result' : result, 'delta': delta}
# working with two local dicts
def my_function_1(data_1, data_2): # works fine
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_1(tradeData, tradeWorkingData ))
print(data1, data2)
# working with a LOCAL copy and GLOBAL
def my_function_2(data2, **data): # works fine
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_2(data2, **data1 ))
print(data1, data2)
# working with a GLOBAL and LOKAL copy
def my_function_3(**data_1, data_2): # doesn't work
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_3(**data1, data2 ))
print(data1, data2)
我确实阅读了文档 (https://docs.python.org/2/tutorial/controlflow.html#keyword-arguments)
为什么后一个功能不起作用?我想问他们为什么要这样做?
我很想更改顺序,所以它应该像在最后一个函数 (my_function_3) 中那样,以便在这种情况下更合乎逻辑。代码只是为了说明问题。
有什么建议可以使这项工作成功吗?他们让解释器拒绝这种参数顺序的技术原因是什么?
你需要知道字典中的 **
和函数定义中的 **
之间的区别。
**
在字典上,例如 func(**d)
表示“将字典中的键值对作为附加命名参数传递给函数 func
”。
def foo(x, y):
print(x, y)
foo(**{'x':1, 'y':2}) # Output: 1 2
foo(**{'z':1, 'y':2}) # Gives error because `foo` function doesn't have an argument named `z`
函数定义中的**
应该添加到最后一项,如func(x, **kwargs)
。这意味着“将传递给此函数的所有附加参数 and/or 关键字参数作为字典条目插入到参数 kwargs
中。”
def foo(**d):
print(d)
foo(x=1, y=2) # Output: {'y': 2, 'x': 1}
让我们看看你的my_function_2()
。
def my_function_2(data_2, **data_1): # works fine
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_2(data2, **data1))
print(data1, data2)
您正在使用参数 data2
和 **data1
调用 my_function_2()
。
- 对于
**data1
,它将字典中的键值对作为附加命名参数传递给 my_function_2()
。
- 对于
my_function_2(data_2, **data_1)
,**data_1
将所有附加参数作为字典。
巧合的是函数外的data1
和函数内的data_1
是一样的
如果你做类似my_function_2(data_2, **data_1, x=3)
的事情,它就会不同。
让我们继续my_function_3()
def my_function_3(**data_1, data_2): # doesn't work
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
函数定义中有一个规则,**kwargs
应该是函数定义参数列表中的最后一项。但是,在my_function_3(**data_1, data_2)
中,你把它放在前面了。
如果你想使用字典的副本,你可以使用 dict.copy(),而不是在字典上使用 **
。
我有一个功能需要两本词典,一本作为副本,一本作为参考。 我明白了。
_start_value = 0.00724
_second_value = 42700.0
_result = 0.0
_delta = 0.0
data1 = {'start_value':_start_value, 'second_value': _second_value }
data2 = {'result' : result, 'delta': delta}
# working with two local dicts
def my_function_1(data_1, data_2): # works fine
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_1(tradeData, tradeWorkingData ))
print(data1, data2)
# working with a LOCAL copy and GLOBAL
def my_function_2(data2, **data): # works fine
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_2(data2, **data1 ))
print(data1, data2)
# working with a GLOBAL and LOKAL copy
def my_function_3(**data_1, data_2): # doesn't work
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_3(**data1, data2 ))
print(data1, data2)
我确实阅读了文档 (https://docs.python.org/2/tutorial/controlflow.html#keyword-arguments) 为什么后一个功能不起作用?我想问他们为什么要这样做?
我很想更改顺序,所以它应该像在最后一个函数 (my_function_3) 中那样,以便在这种情况下更合乎逻辑。代码只是为了说明问题。
有什么建议可以使这项工作成功吗?他们让解释器拒绝这种参数顺序的技术原因是什么?
你需要知道字典中的 **
和函数定义中的 **
之间的区别。
**
在字典上,例如func(**d)
表示“将字典中的键值对作为附加命名参数传递给函数func
”。
def foo(x, y):
print(x, y)
foo(**{'x':1, 'y':2}) # Output: 1 2
foo(**{'z':1, 'y':2}) # Gives error because `foo` function doesn't have an argument named `z`
-
函数定义中的
**
应该添加到最后一项,如func(x, **kwargs)
。这意味着“将传递给此函数的所有附加参数 and/or 关键字参数作为字典条目插入到参数kwargs
中。”
def foo(**d):
print(d)
foo(x=1, y=2) # Output: {'y': 2, 'x': 1}
让我们看看你的my_function_2()
。
def my_function_2(data_2, **data_1): # works fine
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
print(my_function_2(data2, **data1))
print(data1, data2)
您正在使用参数 data2
和 **data1
调用 my_function_2()
。
- 对于
**data1
,它将字典中的键值对作为附加命名参数传递给my_function_2()
。 - 对于
my_function_2(data_2, **data_1)
,**data_1
将所有附加参数作为字典。
巧合的是函数外的data1
和函数内的data_1
是一样的
如果你做类似my_function_2(data_2, **data_1, x=3)
的事情,它就会不同。
让我们继续my_function_3()
def my_function_3(**data_1, data_2): # doesn't work
_value1 = data_1['start_value']
_value2 = data_1['second_value']
res = data_2['result'] + _value1 + _value2
data_2['delta'] = res - data_2['result']
data_2['result'] = res
return res
函数定义中有一个规则,**kwargs
应该是函数定义参数列表中的最后一项。但是,在my_function_3(**data_1, data_2)
中,你把它放在前面了。
如果你想使用字典的副本,你可以使用 dict.copy(),而不是在字典上使用 **
。