【问题标题】:Initialisation of keyword args in PythonPython中关键字参数的初始化
【发布时间】:2010-10-23 22:05:20
【问题描述】:

为什么会这样:

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

a1 = A()
a1._var.append('one')

a2 = A()

结果:

var = [] 182897439952
var = ['one'] 182897439952

我不明白为什么在使用可选关键字参数时不使用列表的新实例,谁能解释一下?

【问题讨论】:

标签: python initialization arguments instantiation


【解决方案1】:

函数定义中的空列表在创建函数本身时创建一次。不是每次调用函数时都创建它。

没错。要解决此问题,请在函数定义中分配 None 并在函数体中检查 None:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))

【讨论】:

    【解决方案2】:

    这是完全错误的。您不能(有意义地)在函数声明中提供可变对象作为默认值。

    class A(object):
        def __init__(self, var=[]):
            self._var = var
            print 'var = %s %s' % (var, id(var))
    

    你必须这样做。

    class A(object):
        def __init__(self, var=None):
            self._var = var if var is not None else []
            print 'var = %s %s' % (var, id(var))
    

    【讨论】:

      【解决方案3】:

      函数定义中的空列表在创建函数本身时创建一次。不是每次调用函数时都创建它。

      如果您每次都想要一个新的,请执行以下操作:

      class A(object):
          def __init__(self, var=None):
              if var is None:
                  var = []
              self._var = var
      

      【讨论】:

      • 一种更简洁的书写方式(未经测试):self._var = var or []
      • 那不一样。例如,“1 or []”是 1,但“0 or []”是 []
      猜你喜欢
      • 2017-05-26
      • 2015-09-06
      • 2022-06-17
      • 2014-12-02
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多