在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'>
但是对于string,在运行时为关键字参数创build一个(空的)string对象。
最干净的方式可能是:
def myfunc(self, my_string=None): self.my_string = my_string or "" # or a if-else-branch, ...