0

我先放代码:

Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> class Item(object):
...     def __init__(self, name, value={}):
...         self.name = name
...         self.value = value
...     def __str__(self):
...         return self.name + " - " + str(self.value)
...     def addValues(self, value):
...         for key,price in value.iteritems():
...             self.value[key] = price
... 
>>> 
>>> item1 = Item('car')
>>> print item1
car - {}
>>> item2 = Item('truck')
>>> print item2
truck - {}
>>> item1.addValues({'blue':6000})
>>> print item1
car - {'blue': 6000}
>>> print item2
truck - {'blue': 6000}
>>> 

我创建了 Item 类的两个实例,item1 和 item2。然后,我使用 addValues 方法更改了对象 item1 上字典属性的值。问题是,添加 item1 的字典属性,也为 item2 添加了相同的值。有人可以解释这里发生了什么吗?更改 item1 上的值如何更改 item2 上的值?我忽略了什么吗?

4

1 回答 1

1

默认参数只评估一次。您的value参数init将始终是同一个字典,因此在处理一个Item实例时对其进行一次变异的效果也会出现在所有其他Item实例中。

docs.python.org/2/reference/compound_stmts.html

执行函数定义时评估默认参数值。这意味着在定义函数时对表达式求值一次,并且每次调用都使用相同的“预计算”值。当默认参数是可变对象(例如列表或字典)时,这一点尤其重要:如果函数修改了对象(例如,通过将项目附加到列表中),则默认值实际上已被修改。这通常不是预期的。解决此问题的一种方法是None用作默认值,并在函数体中显式测试它,例如:

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin
于 2013-09-15T15:50:07.403 回答