【发布时间】:2012-09-26 18:52:42
【问题描述】:
例如,在 JavaScript 中,我们可以编写这样的程序:
var a = 1;
testFunction(++a, ++a, a);
function testFunction(x, y, z){
document.writeln("<br />x = " + x);
document.writeln("<br />y = " + y);
document.writeln("<br />z = " + z);
}
我们会得到一个输出:
x = 2
y = 3
z = 3
这意味着在 JavaScript 中参数是真正从左到右计算的。在 C 中我们会得到输出
x = 3
y = 3
z = 3
我想知道我们是否可以在 Python 中做同样的事情,还是因为它是按值传递参考语言所以不可能?
我编写了一个简单的程序,但我认为这并不能证明什么:
x = 2
def f(x, y, z):
print(x, y, z)
f(x*2, x*2, x**2)
print(x)
4 4 4
2
当我调用函数参数时,Python 不允许我在函数参数中进行任何新的赋值(例如 f(x=4, x, x) 或类似的东西)。
【问题讨论】:
-
实际上,在 C 中,你会得到 UB(因此输出可能因环境而异)。
-
“这意味着在 JavaScript 中参数是真正从左到右计算的。” – 不,这意味着对于此特定环境中此特定代码的此特定运行的此特定实现的此特定版本,参数的评估距离如此之远,以至于 似乎 他们被评估为左-向右。例如,它没有说明在不同 CPU 上的不同操作系统上运行的不同实现。
-
“在 C 中我们会得到输出”——不,我们不会。您展示的代码在 C 中具有未定义的行为,这意味着实现字面上允许任何它想要的。它可以打印
11 7 5,它可以打印4 4 4,它什么都不打印,它可以格式化你的硬盘。所有这些都是规范允许的。
标签: python parameter-passing operator-precedence