1

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我只是想检查一下我期望它的工作方式是否正确。这是我正在编写的课程的简化版本:

class Foo(object):
     def __init__(self):
         pass
     def bar(self, test1=[], test2=[]):
         if test2:
             test1.append(1)
         print test1

现在,对我来说,test1 和 test2 - 除非设置 - 在调用函数 bar 时应该始终设置为空列表。这意味着当 test1 被打印时,列表中应该只有一个项目(假设你只给出一个项目作为参数)。然而,这种情况并非如此:

>>> i = Foo()
>>> i.bar()
[]
>>> i.bar(test2=[1])
[1]
>>> i.bar()
[1, 1]
>>> i.bar(test2=[1])
[1, 1, 1]

在这种情况下,您会期望使用整数得到类似的结果:

class Foo(object):
     def __init__(self):
         pass
     def bar(self, test1=0, test2=0):
         if test2:
             test1 += 1
         print test1

但在这里,test1 始终设置为 0:

>>> i = Foo()
>>> i.bar()
0
>>> i.bar(test2=1)
1
>>> i.bar(test2=1)
1
>>> i.bar(test2=1)
1

似乎列表在函数或类的命名空间中是持久的,但整数不是。

这可能是我的一个误解,所以想澄清一下。

4

1 回答 1

1

函数的默认参数是在声明函数时设置的,而不是每次调用函数时设置的。因此,在声明函数时创建的列表只创建一次,并且每隔一次调用该函数时都会被引用。另请参阅此问题

因为列表是可变的,所以当你改变它们时,任何引用它的东西也会改变。但是整数是不可变的(它们不能更改),因此当您将变量重新分配给另一个整数时,只有该变量会更改,因为它引用了不同的对象。

于 2013-01-15T09:51:17.667 回答