2016-11-04 5 views
-1

私が気付いたことは、複数のステートメントが出力されたときにprint()が時々最終計算値を出力することです。説明するために:Python print()は出力より先に式を計算します

a = [1, 2, 3] 
print(a, a.reverse(), a) 

を出力[3, 2, 1] None [3, 2, 1]ですが、aの第1の出力は、[1, 2, 3]すべきではありませんか?

プリントが分離されている場合、言う:

a = [1, 2, 3] 
print(a, end=' ') 
print(a.reverse(), a) 

出力が正しい[1, 2, 3] None [3, 2, 1]を与えます。

この現象は、バグを見つけようとするのに苦労しました。私は答えを探し回ってきたが、間違った方向に向かっていると思われる。

これは、の前にprint()の値が計算されているためですか。もしそうなら、なぜ


UPDATE:

私が原因で他の言語からの質問をしてきましたが、この理由は、私にとってそれほど明白ではありませんが発生します。たとえば、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)} 

質問は愚かなことかもしれませんが、私はSO上でこの1を除いて、周りのことにこれ以上の答えが表示されません。関数を呼び出す(とprint()がここに機能以上のものではありません)

+0

はい、 'print()'が出力される前に値が計算されます。 –

+0

この情報はとても一般的です。誰もが気付いていますし、質問を下落させるべきですか?私はPythonのドキュメントを読んでいます:https://docs.python.org/3/library/functions.html#print – Nevertheless

+0

'a.reverse()'はリストを変更します。 'list(反転(a))) 'あなたの元のリストを変更せずにあなたに逆のリストを与えるでしょう。 – melak47

答えて

4

、Pythonのは、引数最初を形成するすべての式を実行するためにを持っています。これらの式の結果は、関数呼び出しに渡されます。

さらに、オブジェクトを名前で参照することは、そのオブジェクトのコピーを渡すことはなく、オブジェクト自体を渡します。 aはリストを参照しているので、最初のコピーである別のリストではなく、そのリストを渡しています。

したがって、a,a.reverse()およびaの結果はprint()ファンクションに送信されます。 a.reverse()はリストを置き換えます。の場合、print()コールには、そのリストが逆転された後で、同じリストが2回送信されました。 aの両方の式は、同じリストになり、逆転されてprint()に渡されます。 2番目の例では

、あなたが最初aリストに送って、print()機能は、それを書き出し、その後、print()呼び出しで、あなたはそのリストを逆にして、もう一度印刷する中にそれを渡します。

私は、Pythonがどのように名前を扱うか、そしてパラメータが関数呼び出しにどのように渡されるかについて、おそらく最も混乱しているような印象を受けました。あなたが逆の順序で同じ要素が含まれているリストのコピーに渡したい場合はネッドBatchelderによって

:私はあなたがこれらをよく読んでお勧めします明示的に行う必要があります。このようなコピーを作成するには、a[::-1]またはlist(reversed(a))のいずれかを使用できます。

+0

ありがとうございました。 Batchelderの記事は本当に役に立ちました。 – Nevertheless

関連する問題