在Python中初始化一个stringvariables:“”或None?

假设我有一个具有string实例属性的类。 我应该用“” value还是None来初始化这个属性? 好吗?

def __init__(self, mystr="") self.mystr = mystr 

要么

 def __init__(self, mystr=None) self.mystr = mystr 

编辑 :我认为,如果我使用“”作为初始值,我“ 声明 ”一个variables是stringtypes。 然后我再也不能分配任何其他的types了。 我对吗?

编辑 :我认为这里很重要,我的build议是错误的。 将另一个types赋值给variables没有问题。 我喜欢S.Lott的评论:“ 由于Python中没有任何内容被”声明“,所以你没有想到这是正确的方法。

如果没有一个值在你的程序中有意义(例如一个可选的值),你应该使用None。 无论如何,这是它的目的。

如果这个值必须由__init__的调用者提供,我build议不要初始化它。

如果“”作为默认值有意义,请使用它。

在Python中,types是从用法中推导出来的。 因此,您可以通过只分配另一种types的值来更改types。

 >>> x = None >>> print type(x) <type 'NoneType'> >>> x = "text" >>> print type(x) <type 'str'> >>> x = 42 >>> print type(x) <type 'int'> 

无用于表示“未设置”,而其他任何值用于表示“默认”值。

因此,如果你的类应对空string,并且你喜欢它作为默认值,使用“”。 如果你的类需要检查variables是否被设置,使用无。

请注意,如果您的variables最初是string,则无关紧要。 您可以在任何其他时刻将其更改为任何其他types/值。

这取决于。 如果你想区分传入的参数和传入的空string,你可以使用None。

要么两者都可能是好的,但我不认为有一个确定的答案。

  • 如果要表示该值未设置,则与None比较比比较""更好,因为""可能是有效值,
  • 如果你只是想要一个默认值, ""可能更好,因为它实际上是一个string,你可以调用它的string方法。 如果你与None一起去,这将导致例外。
  • 如果你想向未来的维护者指出这里需要一个string,那么""可以帮助你。

完整的一面说明:

如果你有一个循环,说:

 def myfunc (self, mystr = ""): for other in self.strs: mystr = self.otherfunc (mystr, other) 

那么潜在的未来优化器就会知道str总是一个string。 如果你使用None ,那么它可能不是一个string,直到第一次迭代,这将需要循环展开,以获得相同的效果。 虽然这不是一个假设(它在我的PHP编译器中出现了很多),但您绝对不应该编写代码来考虑这一点。 我只是觉得这可能是有趣的:)

另一种初始化空string的方法是使用不带参数的内置str()函数。

STR(对象= '')

返回一个包含对象的可打印表示的string。

如果没有给出参数,则返回空string“'。

在最初的例子中,这看起来像这样:

 def __init__(self, mystr=str()) self.mystr = mystr 

我个人认为,这更好地传达了你的意图。

注意str()本身设置了默认的参数值''

要么是None ,尽pipeNone作为约定更常见 – None表示没有值传递给可选参数。

有些时候“”是正确的默认值,根据我的经验,那个时候发生的次数less。

既然None和“”都是假的,你可以同时做。 见6.1。 真值testing 。

编辑

要在编辑中回答问题:不,您可以指定其他types。

 >>> a = "" >>> type(a) <type 'str'> >>> a = 1 >>> type(a) <type 'int'> 

对于列表或字典,根据http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#default-parameter-values使用None作为默认参数,答案更为明确。;

但是对于string,在运行时为关键字参数创build一个(空的)string对象。

最干净的方式可能是:

 def myfunc(self, my_string=None): self.my_string = my_string or "" # or a if-else-branch, ...