Pythonic的条件变量初始化方式是什么?

13 投票
5 回答
10974 浏览
提问于 2025-04-17 07:49

由于Python的作用域规则,一旦在某个范围内初始化了变量,之后就可以使用这个变量。因为条件语句不会引入新的作用域,所以在其他编程语言中常见的做法(比如在条件之前初始化一个变量)在Python中并不一定需要。例如,我们可以这样写:

def foo(optionalvar = None):
    # some processing, resulting in...
    message = get_message()
    if optionalvar is not None:
        # some other processing, resulting in...
        message = get_other_message()
    # ... rest of function that uses message

或者,我们也可以这样写:

def foo(optionalvar = None):
    if optionalvar is None:
        # processing, resulting in...
        message = get_message()
    else:
        # other processing, resulting in...
        message = get_other_message()
    # ... rest of function that uses message

当然,get_messageget_other_message这两个函数可能有很多行代码,实际上并不重要(你可以假设在每条路径执行后程序的状态是一样的);这里的目的是让message在函数的其他部分可以使用。

我在其他问题中看到过后面这种写法好几次,比如:

哪种写法更可接受呢?

5 个回答

1

我觉得不设定明确的规则更符合Python的风格,反而应该坚持一个观点,那就是小一点的函数更好(部分原因是这样更容易记住新名字的引入时机)。

不过,我想如果你的条件测试变得比if/else复杂得多,你可能会面临所有条件都失败的风险,这样你在后面使用一个未定义的名字,就可能会导致运行时错误,除非你非常小心。这可能是支持第一种风格的一个理由,尽量在可能的情况下使用它。

4

一般来说,第二种方法更好也更通用,因为它不会无条件地调用 get_message 函数。如果这个函数不太占用资源,那这样做可能没问题,但如果是一个搜索功能就要考虑了。

def search(engine):
    results = get_from_google()
    if engine == 'bing':
       results = get_from_bing()

显然,这样做不好,我想不出第二种情况会有什么特别糟糕的场景。所以,总的来说,最好是采用一种方法,遍历所有选项,最后再执行默认操作,比如:

def search(engine):
    if engine == 'bing':
       results = get_from_bing()
    else:
       results = get_from_google()
13

Python 还有一个非常实用的 if 语法模式,你可以在这里使用。

  message = get_other_message() if optional_var else get_message()

或者,如果你想要严格地和 None 进行比较的话。

  message = get_other_message() if optional_var is not None else get_message()

跟你发的第一个例子不同,这个不会不必要地调用 get_message()。

撰写回答