我有一个嵌套字典,其中包含许多不同对象上的一堆数据(我指的是非编程意义上的对象)。字典的格式是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']
中归零。 WTF?显然,这里发生了一些我不明白的事情。
为了让事情变得更奇怪(从我的观点来看),我试图通过在调用函数之前将数组“保存”到另一个变量来做一个笨拙的kludge来解决这个问题。即我做了
saveFDF = allData[i]['cleanFDF']
然后运行该函数,然后使用“已保存”数据更新cleanFDF
条目:
allData[i].update( {'cleanFDF':saveFDF} )
但不知何故,只需执行clFDF [clFDF&lt;函数内的阈值] = 0修改主friggin'脚本中的clFDF
,saveFDF
和allData[i]['cleanFDF']
,将相同数组索引的所有内容清零!就好像它们都是以某种方式关联的全局变量,但我在任何地方都没有做过这样的声明......
我是一个绝望的Python新手,所以毫无疑问我不了解它是如何工作的。任何帮助将不胜感激!
答案 0 :(得分:2)
您通过引用传递allData[i]['cleanFDF']
的值(https://stackoverflow.com/a/430958/337678处的体面说明)。对其所做的任何更改都将对其引用的对象进行更改,该对象仍然是与原始对象相同的对象,只是分配给不同的变量。
制作数据的深层副本可能会解决您的问题(Python有一个深层复制库,应该可以解决这个问题;)。
答案 1 :(得分:2)
一切都是Python的参考。
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
它会返回[&#39;是&#39;]即使我没有直接更改变量&#39;示例&#39;。
请参阅Why does list.append evaluate to false?,Python append() vs. + operator on lists, why do these give different results?,Python lists append return value。