我试图理解为什么传递给函数的对象的全局副本被函数修改。我理解,如果我将对象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)。但是,当我将全局变量传递给app
或noreturn
时,在这两个实例中,全局变量都被函数修改,而没有声明我想用全局变量修改全局变量。 / 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
?
答案 0 :(得分:1)
你的引述说:
如果您只想访问全局变量,只需使用其名称即可。但是要更改其值,您需要使用global关键字。
我会将其修改为:
如果您只想访问全局变量引用的对象,只需使用其名称即可。但是,要更改它所引用的对象,您需要使用global关键字。
访问全局对象可以包括更改对象的内容(例如将新对象附加到现有的全局列表)。但是,如果您的功能尝试:
def app(mylist):
mylist = mylist + [4]
return mylist
尝试更改全局mylist
引用(通过创建新对象并将结果分配给mylist
),然后您需要使用global
关键字。