修改Python函数中的变量会影响函数外部具有不同名称的变量

时间:2013-01-02 07:13:53

标签: python function variables global-variables

我有一个嵌套字典,其中包含许多不同对象上的一堆数据(我指的是非编程意义上的对象)。字典的格式是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'脚本中的clFDFsaveFDFallData[i]['cleanFDF'],将相同数组索引的所有内容清零!就好像它们都是以某种方式关联的全局变量,但我在任何地方都没有做过这样的声明......

我是一个绝望的Python新手,所以毫无疑问我不了解它是如何工作的。任何帮助将不胜感激!

2 个答案:

答案 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