others - 在 python 中,初始化一个字符串变量:"" 或者None?

假设我有一个带有字符串属性的类,是否要使用""或none初始化此属性?


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

或者


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

时间:

如果空值在程序中有意义(例如,一个可选值),你应该使用None,

如果该值由__init__的调用者提供,则建议不要初始化它。

如果"" 作为默认值有意义,那么使用它。

在Python中,类型是根据用法推导出来的。因此,只需指定另一类型的值即可更改类型。


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

这取决于你要区分传入的参数,以及传入的空字符串。

无用于指示"未设置",而其他任何值用于指示"默认"值。

因此,如果你的类处理空字符串,并且你喜欢它作为默认值,那么使用""。 如果类需要检查变量是否已经设置,则使用无。

请注意,变量是否是字符串无关紧要。 你可以在任何其他时刻将它更改为其他类型/值。

None更为常见,None表示没有要传递值。

可能没问题,但我不认为有一个明确的答案。

  • 如果你想表明没有设置值,与 None 相比,与 "" 相比,比较起来更好,因为 "" 可能是一个有效值,
  • 如果你只想要一个默认值,"" 可能更好,因为它实际上是一个字符串,你可以在它上面调用字符串方法。 如果你使用 None,这将导致异常。
  • 如果你希望向将来的维护者表明这里需要一个字符串,"" 可以帮助。

完整的便笺:

如果有循环,请说:


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

那么潜在的未来优化器会知道 str 总是一个字符串。 如果你使用了 None,那么它可能不是一个字符串,直到第一个迭代,这需要循环展开来获得同样的效果。 虽然这不是一个假设的( 在我的PHP编译器中出现了很多),但你肯定永远不会写你的代码来考虑这一点。 我只是觉得这可能很有趣:

由于既无""又有,你可以同时进行。 参见 6.1.真值测试

编辑

要在你的编辑中回答问题: 否,你可以指定其他类型。


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

对于列表或字典,答案更明确,不使用默认值。

最干净的方法可能是:


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

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

str ( object=')

返回一个字符串,该字符串包含一个对象的良好可以打印的表示形式。

如果没有给出参数,则返回空字符串''。

在原始示例中,看起来像这样:


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

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

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

...