当前位置: 首页 > 面试题库 >

依靠Python函数参数评估顺序是否安全?

安高义
2023-03-14
问题内容

可以安全地假设函数参数在Python中是从左到右求值的吗?

参考文献指出,这种情况会发生,但是也许有某种方法可以更改此顺序,这可能会破坏我的代码。

我想做的是为函数调用添加时间戳:

l = []
l.append(f(), time.time())

我知道我可以按顺序评估参数:

l = []
res = f()
t = time.time()
l.append(res, t)

但是它看起来不太优雅,因此如果可以依靠它,我宁愿采用第一种方法。


问题答案:

是的,Python始终从左到右评估函数参数。

据我所知,这适用于任何逗号分隔的列表:

>>> from __future__ import print_function
>>> def f(x, y): pass
...
>>> f(print(1), print(2))
1
2
>>> [print(1), print(2)]
1
2
[None, None]
>>> {1:print(1), 2:print(2)}
1
2
{1: None, 2: None}
>>> def f(x=print(1), y=print(2)): pass
...
1
2


 类似资料:
  • 问题内容: 当可以设置为None时,使用以下格式是否不好? 问题是,如果my_var为None ,将引发TypeError。 还是我应该使用: 要么 换一个问题,以上哪一项是Python最佳实践(如果有)? 欢迎其他选择! 问题答案: 依赖条件语句的顺序是安全的(此处是Python参考),特别是由于您指出的问题-能够缩短可能导致一系列条件语句出现问题的评估是非常有用的。 大多数语言会弹出这种代码:

  • 问题内容: 为什么这些示例中的第一个不起作用,而其他所有示例都起作用? 问题答案: 这既不是范围问题,也不是关闭问题。问题在于 声明 和 表达式 之间的理解。 JavaScript代码(即使是Netscape的第一个JavaScript版本和Microsoft的第一个副本)也要分两个阶段处理: 阶段1:编译-在此阶段,代码被编译成语法树(字节码或二进制取决于引擎)。 阶段2:执行-然后解析解析的代

  • 问题内容: 以下内容在Python 3.6中从不打印任何内容 相反,它只是坐在那里烧坏了CPU。问题似乎在于,如果迭代器位于无限空间内,则永远不会返回迭代器,因为它首先评估完整的迭代器。鉴于假设应该是发电机,这令人惊讶。 我本来希望这会开始计数(到无穷大),就像这个生成器的行为(直接从docs取得): 但是,尽管我的生成器立即开始计数,但使用的生成器根本不计数。 其他工具可以达到我的期望。例如,以

  • 问题内容: 我做了一些有关JLS 15.7.4和15.12.4.2的阅读,但不能保证不会有任何 编译器/运行时优化 会 改变 方法参数求值的顺序。 假设以下代码: 是否保证编译器或运行时 不会 进行如下错误的优化?这种优化看似正确,但当评估顺序很重要时,它是错误的。 在调用更改将由返回的值的情况下,至关重要的是首先调用,因为要求此更改首先发生。 如果可能, 请显示一些支持您答案的资源或Java文档

  • 问题内容: 有人可以解释一下SELECT语句的概念执行顺序是什么,请提供一个示例吗? 我在Google上进行了搜索,但它们似乎都使用了相同的示例,而没有详尽的解释。 问题答案: 从概念上讲,按以下顺序评估查询: 该条款 该条款 该条款 该条款 该条款 该条款 这是“概念性”处理,解释了SQL的一些作用域规则。实际上,查询的执行方式可能有所不同。 SQL Server文档在此处说明了此顺序。

  • 问题内容: 如果您有一个if语句,其中对多个变量或函数进行了评估,那么按什么顺序对其进行评估? 在这种特定情况下,是将foo相对于5评估,然后将6相对于吧(从左至右)进行评估,还是将其从右至左进行评估?我假设a和以相同顺序求值。 问题答案: 如果第一个是,则将首先评估left子句,然后评估第一个。 这就是为什么您可以执行以下操作的原因: 没有破坏。 相反,对于子句,只有第一个为:时,将评估righ