在 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'>
【讨论】:
好吧,如果他检查真相,那么他会错过""
可能是一个有效值。最好他检查None
ness。
由于我们不知道 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 中初始化一个字符串变量:“”还是无?的主要内容,如果未能解决你的问题,请参考以下文章