【发布时间】:2021-04-29 07:15:34
【问题描述】:
考虑以下情况:
案例一:
def fun(arg):
arg += 1
my_var = 1
fun(my_var)
print(my_var)
>> 1
案例 2:
def fun(arg):
arg += [4]
my_var = [1,2,3]
fun(my_var)
print(my_var)
>> [1, 2, 3, 4]
案例 3:
def fun(arg):
arg = arg + [4]
my_var = [1,2,3]
fun(my_var)
print(my_var)
>> [1, 2, 3]
案例 4:
def fun(arg):
print(arg)
fun("Hi")
print(arg)
>> Hi
Traceback (most recent call last):
File "<string>", line 8, in <module>
NameError: name 'arg' is not defined
案例 4 表明参数变量的范围位于函数内。情况 1 和 3 支持,因为函数内 arg 变量的更改不会反映在全局参数中。
但是为什么情况 2 会发生呢?当我使用 append 而不是 += 时,我注意到了同样的事情。发生在 arg 上的更改不应该对从不同范围调用函数的变量产生任何影响吗?
任何帮助表示赞赏。提前致谢。
【问题讨论】:
-
将新值赋给变量(案例 1,3)不同于 mutating 值(恰好被变量“持有”)(案例 2) .或者换句话说:在情况 1 和 3 中,您正在读取和写入
arg。在案例 2 中,您只是从 arg 中读取。 -
+=对于列表来说有点奇怪,因为它会改变左边的操作数。mylist += X与mylist = mylist + X做了不同的事情。见Why does += behave unexpectedly on lists? -
这是 Robert Heaton 对函数作用域的一个很好的整体解释,JFYI robertheaton.com/2014/02/09/…