11

最近の Python 3.6 リリースで新しい f-strings をいじっているときに、次のことに気付きました。

  1. foovalue で変数を作成しますbar

    >>> foo = 'bar'
    
  2. 次に、f-string である新しい変数を宣言し、fooフォーマットする必要があります。

    >>> baz = f'Hanging on in {foo}'
    
  3. bazOK、すべてうまくいっているので、その値を確認するために呼び出します。

    >>> baz
    'Hanging on in bar'
    
  4. の値を変更して、もう一度foo呼び出してみましょう。baz

    >>> foo = 'spam'
    >>> baz
    'Hanging on in bar'
    

それは動的であるべきではありませんか?なぜこれが起こるのですか?fooの値が変化すると f-string が更新されると思っていましたが、そうはなりませんでした。これがどのように機能するかわかりません。

4

2 に答える 2

15

は、実行時にすでにf-string評価されています。

>>> baz = f'Hanging on in {foo}'

具体的には、名前の値を検索し、見つかった値であるfooに置き換え'bar'ました。bazフォーマットされた後の文字列が含まれます。

f-strings は一定ではありません。つまり、評価された後に評価を待つ置換フィールドが内部にありません。それらは実行時に評価され、その後、割り当てられた値は通常の文字列になります

>>> type(f'hanging on in {foo}')
<class 'str'>

参考までに、フォーマットされた文字列リテラルのセクションを参照してください。

[..] 他の文字列リテラルは常に定数値を持ちますが、フォーマットされた文字列は実際には実行時に評価される式です。[..]

式 (置換フィールドのルックアップとその結果の書式設定) が実行された後、それらについて特別なことは何もありません。式は文字列に評価され、 に割り当てられていbazます。

于 2016-12-23T19:36:31.280 に答える