我注意到,print()
有时在打印多个语句时输出最终的计算值。举例说明:
a = [1, 2, 3]
print(a, a.reverse(), a)
输出是[3, 2, 1] None [3, 2, 1]
,但是a
的第一个输出不应该是[1, 2, 3]
?你知道吗
如果指纹分开了,说:
a = [1, 2, 3]
print(a, end=' ')
print(a.reverse(), a)
输出给出正确的[1, 2, 3] None [3, 2, 1]
。你知道吗
这种行为让我花了好几分钟才弄明白这个错误。我到处都在寻找答案,但估计我找错方向了。你知道吗
这是因为值是在print()
之前计算的吗?如果是,为什么?你知道吗
更新:
我问这个问题是因为从其他语言的经验来看,这个问题的原因对我来说并不那么明显。例如,PHP:
$a = [1, 2, 3];
var_dump(
$a, array_pop($a), $a
);
生成不带预执行表达式的输出:
array(3) {[0]=>int(1) [1]=>int(2) [2]=>int(3)}
int(3)
array(2) {[0]=>int(1) [1]=>int(2)}
虽然这个问题可能很愚蠢,但除了这个问题,我看不到其他答案了。你知道吗
当您调用一个函数时(这里的
print()
只不过是一个函数),Python必须首先执行构成参数的所有表达式。然后将这些表达式的结果传递到函数调用中。你知道吗此外,按名称引用对象不会传入该对象的副本,而是传入对象本身。因为
a
引用了一个列表,所以传递的是该列表,而不是第一个列表的副本。你知道吗因此在第一个示例中,表达式
a
、a.reverse()
和a
的结果被发送到print()
函数。因为a.reverse()
改变了一个列表的位置,所以在列表被反转之后,您只需将同一个列表发送给print()
调用两次。两个a
表达式产生相同的列表,该列表已反转,并传递给print()
。你知道吗在第二个示例中,首先发送
a
列表,print()
函数将其写出,然后在第二个print()
调用中,反转该列表并将其传入以再次打印。你知道吗我的印象是,您可能对Python如何处理名称以及如何将参数传递到函数调用中最困惑。我建议你仔细阅读以下内容:
如果要以相反的顺序传递包含相同元素的列表的副本,则必须显式地这样做。您可以使用
a[::-1]
或list(reversed(a))
生成这样的副本。你知道吗相关问题 更多 >
编程相关推荐