3

いくつかの異なるオブジェクト(プログラミング以外の意味でのオブジェクトを意味します)に関する一連のデータを含むネストされた辞書があります。ディクショナリの形式はallData[i][someDataType]です。ここで、iはデータがあるオブジェクトの番号指定であり、someDataTypeは問題のオブジェクトに関連付けられた特定のデータ配列です。

これで、オブジェクトごとに計算を実行するために特定のデータ配列を必要とする、定義した関数ができました。データ配列はと呼ばれcleanFDFます。だから私はこれを私の関数に、それが機能するために必要な他のたくさんのものと一緒に供給します。私はそれをこのように呼びます:

rm.analyze4complexity(allData[i]['cleanFDF'], other data, other data, other data)

関数自体の中で、私はすぐにcleanFDFデータを別の変数名、つまり。に再割り当てしますclFDF。つまり、最終結果は次のとおりです。

clFDF = allData[i]['cleanFDF']

次に、特定のしきい値を下回るすべてのデータをゼロにする必要があります。

clFDF[ clFDF < threshold ] = 0

OK-関数は想定どおりに機能します。しかし、元のcleanFDFデータをメインスクリプトにプロットし直そうとすると、clFDFでゼロにされたエントリもでゼロになりallData[i]['cleanFDF']ます。WTF?明らかに、私が理解していない何かがここで起こっています。

さらに奇妙なことに(私の観点から)、関数を呼び出す前に配列を別の変数に「保存」することで、これを回避するために厄介な問題を解決しようとしました。つまり、私はします

saveFDF = allData[i]['cleanFDF']

次に、関数を実行cleanFDFし、「保存された」データでエントリを更新します。

allData[i].update( {'cleanFDF':saveFDF} )

しかし、どういうわけか、関数内でclFDF [clFDF <threshold] = 0を実行するだけで、変更clFDFsaveFDFallData[i]['cleanFDF']、メインのfriggin'スクリプトでは、同じ配列インデックスですべての全体がゼロになります。どういうわけか、それらはすべて関連するグローバル変数のようですが、私はどこにもそのような宣言をしていません...

私は絶望的なPython初心者なので、それがどのように機能するかについて何かを理解していないことは間違いありません。どんな助けでも大歓迎です!

4

2 に答える 2

2

allData[i]['cleanFDF'] 参照によって値を渡しています( https://stackoverflow.com/a/430958/337678の適切な説明)。それに加えられた変更は、それが参照するオブジェクトに加えられます。これは、元のオブジェクトと同じオブジェクトであり、別の変数に割り当てられているだけです。

データのディープ コピーを作成すると、問題が解決する可能性があります (Python には、このトリックを実行するディープ コピー ライブラリがあります ;))。

于 2013-01-02T07:21:12.437 に答える
2

Python ではすべてがリファレンスです。

def function(y):
    y.append('yes')
    return y

example = list()
function(example)
print(example)

変数「example」を直接変更していなくても、['yes'] が返されます。

list.append が false と評価される理由を参照してください。、リストの Python append() と + 演算子、なぜこれらは異なる結果をもたらすのですか? Python リストは戻り値を追加します

于 2013-01-02T07:37:27.123 に答える