7

Python がこの辞書をどのように反復処理しているか混乱しています。Python のドキュメントから、 itervalues はディクショナリの値に対してイテレータを返します。

dict = {"hello" : "wonderful", "today is" : "sunny", "more text" : "is always good"}

for x in dict.itervalues():
    x = x[2:]   

print dict

これにより、元の辞書が変更されずに出力されます。何故ですか?位置 x の値が「blabla」であると言っている場合、なぜ設定されないのですか?

4

3 に答える 3

7

これは文字列やリストとは関係ありません。悪魔はそのfor展開の仕方にある。

やっている

for x in d.iteritems():
    # loop body

することとほぼ同等です

iter = d.itervalues()
while True:
    try:
        x = next(iter)
        # loop body
    except StopIteration:
        break

xしたがって、これを念頭に置いて、関数呼び出しの結果を保持する を再割り当てしているだけであることを理解するのはそれほど難しくありません。

iter = d.itervalues()
while True:
    try:
        x = next(iter)

        x = 5 # There is nothing in this line about changing the values of d
    except StopIteration:
        break
于 2011-08-10T19:38:35.297 に答える
5

ラインの唯一のもの

x = x[2:]

文字列スライスを作成し、この新しい文字列を指すようにx[2:]名前を再バインドします。以前に指されxた文字列は変更されません。x(文字列は Python では不変であり、変更することはできません。)

実際に必要なものを実現するには、辞書エントリがスライスによって作成された新しい文字列オブジェクトを指すようにする必要があります。

for k, v in my_dict.iteritems():
    my_dict[k] = v[2:] 
于 2011-08-10T19:38:44.073 に答える
1

Sven Marnachが指摘しているように、文字列は不変であり、スライス表記によって作成された新しい文字列に再バインドするだけですx。次を使用して、辞書内の同じオブジェクトを指していることを示すことができx ますid

>>> obj = 'hello'

>>> id(obj)
<<< 4318531232

>>> d = {'key': obj}   

>>> [id(v) for v in d.values()]
<<< [4318531232]

>>> [id(v) for v in d.itervalues()]
<<< [4318531232]

>>> [(k, id(v)) for k, v in d.items()]
<<< [('key', 4318531232)]

>>> [(k, id(v)) for k, v in d.iteritems()]
<<< [('key', 4318531232)]

iteritemsキーと値を一緒に繰り返し処理して、必要なことを実行できます。

for k,v in dict.iteritems():
    dict[k] = v[2:]
于 2011-08-10T19:39:50.500 に答える