1

リスト frameChain が空 ( []) として反映されるという問題があります。frameChain実際には次のようなリストです。['C Level', 'Medium Term']

jsonOut[x]= {'TEXT' : node.attrib['TEXT'],
             'ID': node.attrib['ID'],
             'Sessions' : frameChain,}

私が定義した関数の外でこれを試してみましたが、うまくいくようです。なぜこれがここで異なるのかについてのアイデアはありますか?

x外部ディクショナリのインデックスを示す単なるカウンターです。

4

1 に答える 1

1

あなたのコメントに基づいて、リストを辞書に追加した後にリストを変更していた可能性があります。Pythonでは、ほとんどすべて。変数名、リスト項目、辞書項目などは値を参照するだけで、それ自体は含まれません。リストは可変であるため、リストを辞書に追加し、後で別の名前でリストを変更すると、変更も辞書に表示されます。

あれは:

# Both names refer to the same list
a = [1]
b = a    # make B refer to the same list than A
a[0] = 2 # modify the list that both A and B now refer to
print a  # prints: [2]
print b  # prints: [2]

# The value in the dictionary refers to the same list as A
a = [1]
b = {'key': a}
a[0] = 2
print a # prints: [2]
print b # prints: {'key': [2]}

ただし、変数に新しい値を割り当てても、参照される値は変更されないことに注意してください。

# Names refer to different lists
a = [1]
b = a   # make B refer to the same list than A
a = [2] # make A refer to a new list
print a # prints [2]
print b # prints [1]

新しいリストを作成し、アイテムを古いリストから新しいリストに 1 つずつ「手動で」コピーしました。それは機能しますが、多くのスペースを占有します。スライスを使用してそれを行う簡単な方法があります。スライスすると新しいリストが返されるため、開始位置と終了位置を指定しない場合、つまり. と書くlist_variable[:]と、基本的には元のリストのコピーを返すだけです。

つまり、元の例を次のように変更します。

# Names refer to different lists
a = [1]
b = a[:] # make B refer to a copy of the list that A refers to
a[0] = 2
print a  # prints: [2]
print b  # prints: [1]

# The value in the dictionary refers to a different list than A
a = [1]
b = {'key': a[:]}
a[0] = 2
print a # prints: [2]
print b # prints: {'key': [1]}
于 2012-10-25T06:10:34.537 に答える