我试图在代码的开头存储一个字典模板,大多数函数都会使用它:
我填写了所有客户及其用户。然后代码的每个部分都可以复制这个字典并产生它拥有的输出。目标是每个输出都具有相同的基数"字典结构,如模板,其中无可修改。
对于使用此词典的每个进程,我使用以下内容:
process1dict = clientdict
# processing 1
output1dict = ... #modified version of original clientdict, the None values have been replaced by dictionaries/lists
process2dict = clientdict
# processing 2
output2dict = ... #same here but could be different
我遇到的问题是cliendict每次复制到进程时都会改变!
我注意到,由于我的初始None
中的cliendict
值在每个进程后都会发生变化(当然,取决于每个进程的输出)。
修改:我找到了副本库但copy()
似乎对我的情况没有帮助。我会尝试使用deepcopy(),但为什么copy()
没有用?为什么deepcopy()
会?
答案 0 :(得分:4)
当您使用类似字典或列表的可变集合并执行赋值时,默认情况下您不创建该对象的副本 - 即,将某些字典b
分配给另一个字典a
创建了从b
到原始对象a
的引用,这样当你变异b
时,你间接地也会改变a
。
请参阅此基本示例:
>>> orig = {"a": 1, "b": 2}
>>> new = orig
>>> new["a"] = 9
>>> orig
{'a': 9, 'b': 2}
>>> new
{'a': 9, 'b': 2}
>>> new is orig
True
要解决此问题,并将new
和orig
词典分隔为彼此不引用的对象,请在将orig
分配给new
时>>> import copy
>>> orig = {"a": 1, "b": 2}
>>> new = copy.deepcopy(orig)
>>> new["a"] = 9
>>> orig
{'a': 1, 'b': 2}
>>> new
{'a': 9, 'b': 2}
>>> new is orig
False
}}:
def get_xpath_from_element(driver, element):
return driver.execute_script("gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b<e.length;b++){var d=e[b];if(d===c){return gPt(c.parentNode)+'/'+c.tagName.toLowerCase()+'['+(a+1)+']'}if(d.nodeType===1&&d.tagName===c.tagName){a++}}};return gPt(arguments[0]);", element)
另外,这里是上面链接的Python文档的tl; dr:
Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项目的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。