foo =“foo” def bar(foo): foo =“bar”
bar(foo)
print foo
# foo is still "foo"...
foo = {'foo':"foo"}
def bar(foo):
foo['foo'] = "bar"
bar(foo)
print foo['foo']
# foo['foo'] is now "bar"?
我有一个函数在我传递字典时无意中覆盖了我的函数参数。是否有一种干净的方式将我的参数声明为常量,或者我是否在函数中制作了字典的副本?
谢谢!
答案 0 :(得分:3)
在这种情况下,如果要更改字典并将更改保留在函数本地,则必须复制字典。
原因是,当您将字典传递到第二个bar
函数时,Python只传递对字典的引用。因此,当您在函数内部修改它时,您将修改函数外部存在的同一对象。另一方面,在第一个bar
函数中,当您编写foo
时,在函数内部为名称foo = "bar"
分配不同的对象。执行此操作时,函数内的名称foo
将开始引用字符串"bar"
,而不是字符串"foo"
。您已更改名称所指的对象。但是函数内部的foo
和函数外部的foo
是不同的名称,因此如果更改函数内部foo
标记的对象,则不会影响名称{{1}在函数之外。所以他们引用不同的对象。
答案 1 :(得分:1)
参数按值传递,但在这种情况下,该值是对象的引用。这也称为call by sharing。所以是的,如果你需要一个新的字典,你将不得不在函数中创建一个。
答案 2 :(得分:0)
我想补充说明
temp_dict = CONSTdict
没有帮助,因为这只是复制指针。
相反,我需要:
temp_dict = dict(CONSTdict)
干杯,
肖恩