在Python中初始化一个字符串变量:“”或None?

时间:2009-09-09 07:49:17

标签: python

假设我有一个带有字符串实例属性的类。 我应该使用“”值还是来初始化此属性?好吗?

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

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

修改:我认为如果我使用“”作为初始值,我会“声明”变量为字符串类型。然后我将无法再为其分配任何其他类型。我是对的吗?

编辑:我认为这里需要注意的是,我的建议是错误的。将另一种类型分配给变量没有问题。我喜欢 S.Lott 的评论:“因为Python中的任何内容都没有”声明“,所以你没有考虑到这一点。

11 个答案:

答案 0 :(得分:65)

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

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

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

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

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

答案 1 :(得分:11)

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

因此,如果您的类处理空字符串并且您希望它作为默认值,请使用“”。如果您的类需要检查变量是否已设置,请使用无。

请注意,如果您的变量最初是一个字符串并不重要。您可以在任何其他时刻将其更改为任何其他类型/值。

答案 2 :(得分:8)

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

  

STR(对象= '')

     

返回一个包含对象的可打印表示的字符串。

     

...

     

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

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

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

就个人而言,我相信这更好地传达了你的意图。

请注意str()本身设置默认参数值''的方式。

答案 3 :(得分:5)

这取决于。如果要区分根本没有传入的参数和传入的空字符串,可以使用None。

答案 4 :(得分:5)

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

  • 如果您想表明尚未设置该值,则与None进行比较优于与""进行比较,因为""可能是有效值,
  • 如果您只想要一个默认值,""可能更好,因为它实际上是一个字符串,您可以在其上调用字符串方法。如果您使用None,则会导致例外情况。
  • 如果您希望向未来的维护者表明此处需要字符串,""可以提供帮助。

完整的附注:

如果你有一个循环,请说:

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

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

答案 5 :(得分:3)

要么很好,尽管None作为约定更常见 - None表示没有为可选参数传递值。

是“”是正确使用的默认值的时间 - 根据我的经验,这些时间不常发生。

答案 6 :(得分:1)

由于None和“”都是假的,你可以同时做到这两点。请参阅6.1. Truth Value Testing

修改

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

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

答案 7 :(得分:1)

对于列表或词组,答案更清楚, 根据{{​​3}} 使用None作为默认参数。

但是对于字符串,一个(空)字符串对象在运行时被实例化 关键字参数。

最干净的方式可能是:

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

答案 8 :(得分:1)

在python中,两种方法都可以。我个人更喜欢“”。但是同样,两种方法都可以

>>>x = None
>>>print(x)
None
>>>type(x)
<class 'NoneType'>
>>>x = "hello there"
>>>print(x)
hello there
>>>type(x)
<class 'str'>
>>> 
>>>x = ""
>>>print(x)

>>>type(x)
<class 'str'>
>>>x = "hello there"
>>>type(x)
<class 'str'>
>>>print(x)
hello there

答案 9 :(得分:0)

empty_string = ""

if not empty_string:

    print "Empty string is not set"

=>未设置空字符串

if empty_string is not None:
    print "Empty string is not None"

=>空字符串不是None

答案 10 :(得分:0)

Python哲学要易读。
这就是为什么最好在__init__()中定义属性的原因,即使它是可选的。
本着同样的精神,您必须问自己,对于阅读您的代码的人来说,哪种方法更清晰。实际上,类型本身提供了有关变量将来使用的许多信息。所以:

kind = None

从语法上来说是正确的,但是读者了解的并不多。它是字符串,整数代码还是列表等?

kind_str = None
kind = ""

两个都多说一遍,第一个在名称中具有类型,第二个在其声明中。我会第二次去,更整齐。