在Python中,你很少会遇到未定义的变量,如果确实出现了这种情况,通常意味着你犯了错误。然而,方便地是,通常用作默认值的值类型(空容器、零长度字符串、零和None
)在Python中都是“假”的,因此你有时会看到像这样的代码,利用了Python中布尔运算符的工作方式:
name = name or "Guido" # if name is empty, set it to "Guido"
numb = numb or 42 # if numb is zero, set it to 42
这种方法有效的原因是,如果第一个参数是“真值”(即非零、非空或True),Python就会停止评估或运算,这被称为短路,无论哪种情况,它都返回实际参数,而不仅仅是True或False。所以,如果
name
是"Jim",那么
"Jim" or "Guido"
的结果将是
"Jim"
,因为
"Jim"
是一个非零长度的字符串,因此为“真值”。
当你不知道正在处理的值的类型和/或“假值”是一个有效值时,当然,这种方法不能很好地工作。但是,在处理配置文件和
raw_input()
等内容时,它会相当有效,因为缺少值会返回一个空字符串:
name = raw_input("What is your name? ") or "Guido"
另一个常见的习语用于处理字典中的项。 字典类的get()
方法允许您指定默认值,以用于字典中不存在该变量的情况。
name = values.get("name", "Guido")
当您的函数使用**kwargs
约定传递关键字参数时,可以使用此功能。您也可以将其与变量一起使用,因为globals()
和locals()
函数分别返回当前作用域中所有全局或本地变量的字典:
name = locals().get("name", "Guido")
然而,正如我所说,你在Python中很少会遇到实际未定义的变量。例如,在Web框架等情况下,你将作为字典传递查询字符串参数,并且可以使用该字典的
.get()
方法。
在极少数情况下,如果名称实际上不存在(例如,您的配置文件是以Python语法写成的,并且您将其作为Python模块导入而不是解析它,并且您希望用户能够省略某些值......或者其他同样疯狂的情况),那么你可以使用
getattr()
,它(就像字典的
.get()
)接受一个默认值:
import config
name = getattr(config, "name", "Guido")
或者让它抛出一个NameError
并捕获它。
$foo
已经为假,那么$foo ||= "what"
将重新赋值$foo
。当然,undef
是假的,但是零和空字符串也是。要只重新赋值未定义的值,请改用斜杠,例如$foo //= "what"
。 - Borodin//
(以及它的扩展形式,//=
)是在 Perl 5.10 中添加的。如果您仍然停留在 5.8.x 版本上,则无法使用//=
(如果可能的话,强烈建议升级版本)。 - Dave Sherohman