在 Python 中初始化一个字符串变量:“”还是无?

Posted

技术标签:

【中文标题】在 Python 中初始化一个字符串变量:“”还是无?【英文标题】:Initialize a string variable in Python: "" or None? 【发布时间】:2021-12-19 08:32:39 【问题描述】:

假设我有一个具有 string 实例属性的类。 我应该使用 "" 值还是 None 来初始化此属性?两者都可以吗?

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

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

编辑:我的想法是,如果我使用 "" 作为初始值,我会“声明”一个变量字符串 类型。然后我以后将无法为其分配任何其他类型。我说的对吗?

编辑:我认为这里需要注意的是,我的建议是错误的。并且为变量分配另一种类型是没有问题的。我喜欢 S.Lott 的评论:“由于 Python 中没有任何东西是“声明”的,所以你没有正确考虑这一点。

【问题讨论】:

由于 Python 中没有任何内容是“声明”的,因此您没有以正确的方式考虑这一点。 【参考方案1】:

如果没有值在你的程序中有意义(例如,一个可选值),你应该使用 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:None或""含义是什么?设计选择完全取决于哪个值更有意义。 在上面的例子中,x 的“类型”没有改变。相反,您有 3 个不同类型的对象: >>> x = None >>> id(x) 1461526688 >>> x = "text" >>> id(x) 2520221413080 >>> x = 42 >>> id (x) 1461692432 相反,标签 x 已围绕三个对象移动。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

str(object='')

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

...

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

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

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

就我个人而言,我认为这更能传达你的意图。

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

【讨论】:

对于不可变类型的结果与 '', 0, False, () 相同。对于可变类型,它甚至像 []、、set() 等那样糟糕,因为默认的初始化函数只被调用一次,并且结果被反复用于 _init_..跨度> 【参考方案4】:

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

【讨论】:

【参考方案5】:

可能都可以,但我认为没有明确的答案。

如果要表明该值尚未设置,与None 比较优于与"" 比较,因为"" 可能是一个有效值, 如果你只想要一个默认值,"" 可能更好,因为它实际上是一个字符串,你可以在它上面调用字符串方法。如果你选择None,这些会导致异常。 如果您希望向未来的维护者表明此处需要字符串,"" 可以提供帮助。

完整的旁注:

如果你有一个循环,说:

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

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

【讨论】:

好的 cmets,但您应该避免使用 str 作为变量名,因为它会影响内置的 str() 函数。【参考方案6】:

两者都可以,尽管None 作为惯例更常见 - None 表示没有为可选参数传递值。

有时“”是要使用的正确默认值 - 根据我的经验,这种情况发生的频率较低。

【讨论】:

【参考方案7】:

因为 None 和 "" 都是假的,你可以同时做。见6.1. Truth Value Testing。

编辑

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

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

【讨论】:

好吧,如果他检查真相,那么他会错过"" 可能是一个有效值。最好他检查Noneness。 由于我们不知道 OP 在检查什么,所以你和我都无法判断什么对他更好。顺便说一句,当您否决我的答案时,您是否考虑过我明确标记的编辑,它回答了 OPs 编辑?【参考方案8】:

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

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

最干净的方法可能是:

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

【讨论】:

为什么?那是默认参数的工作,为什么要这样做两次?为什么不明确哪个值是默认值?而且,另外,“”很明显地声明该函数需要一个字符串,None 不会告诉你。【参考方案9】:

在 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

【讨论】:

【参考方案10】:
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

【讨论】:

【参考方案11】:

Python 哲学是可读的。 这就是为什么最好在 __init__() 中定义您的属性,即使它是可选的。 本着同样的精神,你必须问问自己,对于阅读你的代码的人来说,什么更清楚。事实上,类型本身提供了很多关于未来使用变量的信息。所以:

kind = None

语法正确,但读者了解不多。是字符串、整数形式的代码、列表等吗?

kind_str = None
kind = ""

两者都说多了,第一个在其名称中包含类型,第二个在其声明中。我会选择第二个,更整洁。

【讨论】:

以上是关于在 Python 中初始化一个字符串变量:“”还是无?的主要内容,如果未能解决你的问题,请参考以下文章

python中子类对父类初始化变量的赋值

Python中,如何初始化不同的变量类型为空值

python的变量与数据类型

C++javapython的一些区别

python属性重新赋值叫啥

如何“声明”一个空字节变量?