修改函数更改中的局部全局传递给Python中的函数

时间:2014-08-21 19:32:41

标签: python pandas

我试图理解为什么传递给函数的对象的全局副本被函数修改。我理解,如果我将对象mylist分配给第二个变量名,它就不会复制,修改第二个对象会改变第一个,因为它们是同一个。例如:

mylist = []
s = mylist
s.append(2)
print(mylist)
[2]

但是,除非明确指出global varname,否则我认为这不会发生在函数中。正如这个answer所说,“如果你想简单地访问一个全局变量,你只需要使用它的名字。但是要改变它的值,你需要使用全局关键字。”这就是下面的函数mult的行为方式(though I am not modifying x but assigning a new value to it)。但是,当我将全局变量传递给appnoreturn时,在这两个实例中,全局变量都被函数修改,而没有声明我想用全局变量修改全局变量。 / p>

import pandas as pd

def mult(x):
    x = x * x
    return x

def app(mylist):
    mylist.append(4)
    return mylist


def noreturn(df):
    df['indexcol'] = list(df.index)

df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
print(df)

    A   B      C
0  10  20     32
1  20  30    234
2  30  10     23
3  40  40     23
4  50  50  42523



noreturn(df)
print(df)

    A   B      C  indexcol
0  10  20     32         0
1  20  30    234         1
2  30  10     23         2
3  40  40     23         3
4  50  50  42523         4



x = 3
mylist = []

y = mult(x)
newlist = app(mylist)
print(x, y)
(3, 9)
print(mylist, newlist)
([4], [4])

如果我想要一个不修改全局变量的函数,我是否需要对传递给函数的每个变量使用copy.deepcopy

1 个答案:

答案 0 :(得分:1)

你的引述说:

  

如果您只想访问全局变量,只需使用其名称即可。但是要更改其值,您需要使用global关键字。

我会将其修改为:

  

如果您只想访问全局变量引用的对象,只需使用其名称即可。但是,要更改它所引用的对象,您需要使用global关键字。

访问全局对象可以包括更改对象的内容(例如将新对象附加到现有的全局列表)。但是,如果您的功能尝试:

def app(mylist):
    mylist = mylist + [4]
    return mylist

尝试更改全局mylist引用(通过创建新对象并将结果分配给mylist),然后您需要使用global关键字。