我在使用copy.copy()和copy.deepcopy()以及Python的範圍時遇到問題。我調用一個函數並將字典作爲參數傳遞。字典複製本地字典,但字典不保留被複制的值。複製/深度複製和變量範圍
def foo (A, B):
localDict = {}
localDict['name'] = "Simon"
localDict['age'] = 55
localDict['timestamp'] = "2011-05-13 15:13:22"
localDict['phone'] = {'work':'555-123-1234', 'home':'555-771-2190', 'mobile':'213-601-9100'}
A = copy.deepcopy(localDict)
B['me'] = 'John Doe'
return
def qua (A, B):
print "qua(A): ", A
print "qua(B): ", B
return
# *** MAIN ***
#
# Test
#
A = {}
B = {}
print "initial A: ", A
print "initial B: ", B
foo (A, B)
print "after foo(A): ", A
print "after foo(B): ", B
qua (A, B)
copy.deepcopy工作並且在函數「foo」中,字典A具有localDict的內容。但在「foo」的範圍之外,字典A是空的。同時,在分配了一個鍵和值之後,字典B保留了函數'foo'出來後的值。
如何在函數「foo」之外保留copy.deepcopy()副本的值?
爲什麼'foo'不能'返回localDict,B'並在代碼中使用'A,B = foo(A,B)'?這樣它*會*工作,你根本不需要使用'copy'模塊。另外,閱讀一下Python的對象引用:http://stackoverflow.com/questions/575196/in-python-why-can-a-function-modify-some-arguments-as-perceived-by-the-caller – Blender 2012-04-21 03:05:36
@Blender,是的我知道我可以做到這一點,但我想知道爲什麼在字典按引用傳遞時,deepcopy()會導致Python中的字典存在範圍問題。 – SQA777 2012-04-21 03:12:54
它根本不是'deepcopy'或'copy'(你真的應該使用'dict(otherdict)'來複制,但那不是重點)。當你將一個對象傳遞給一個函數並且只能修改一些對象時,Python不能像PHP一樣工作。閱讀我鏈接到的問題的答案。 – Blender 2012-04-21 03:15:47