【发布时间】:2012-04-21 03:02:11
【问题描述】:
我在使用 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”中,dict A 具有 localDict 的内容。但是在“foo”的范围之外,dict A 是空的。同时,在分配了键和值后,dict B 保留了从函数 'foo' 出来后的值。
如何维护 copy.deepcopy() 在函数“foo”之外复制的值?
【问题讨论】:
-
为什么不在您的代码中使用
foo和return localDict, B并使用A, B = foo(A, B)?这样它将工作,您根本不需要使用copy模块。另外,阅读一下 Python 的对象引用:stackoverflow.com/questions/575196/… -
@Blender,是的,我知道我可以这样做,但我想知道当字典通过引用传递时,为什么 deepcopy() 会导致 Python 中的字典出现范围问题。
-
它根本不是
deepcopy或copy(你真的应该使用dict(otherdict)来复制,但这不是重点)。当您将对象传递给函数并且只能修改某些对象时,Python 不像 PHP 那样工作。阅读我链接到的问题的答案。
标签: python