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

好的 - 该功能按预期工作。但是现在当我尝试在主脚本中绘制原始 cleanFDF 数据时,在 clFDF 中归零的条目也会在allData[i]['cleanFDF']. 怎么回事?显然这里发生了一些我不明白的事情。

为了使事情变得更奇怪(从我的角度来看),我试图通过在调用函数之前将数组“保存”到另一个变量来解决这个问题。即我愿意

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)

即使我没有直接更改变量“示例”,它也会返回 ['yes']。

请参阅为什么 list.append 评估为 false?, Python append() 与列表上的 + 运算符,为什么这些会给出不同的结果?, Python 列表追加返回值

于 2013-01-02T07:37:27.123 回答