【发布时间】:2021-02-09 19:26:59
【问题描述】:
在 Python 中,我发现以下与变量作用域相关的函数行为有些令人费解。似乎函数可以在函数之外更改数组的元素,但不能完全替换数组。这是什么工作原理?
a = np.array([2,3,5])
b = np.array([2,3,5])
def fun1():
a[1] = 100
return
def fun2():
b = -1.1
return
fun1()
print(a)
fun2()
print(b)
【问题讨论】:
-
你能澄清你在问什么吗?您是在问分配范围的规则是什么?您是否在问为什么这些规则会导致这种行为?您是在问为什么这种行为被认为是可取的?
-
这里缺少的关键是assignment 永远不会变异。简单赋值
b = -1.1只是将局部变量b绑定到值-1.1。另一方面,fun1使用a[1] = 100,实际上只是对a.__setitem__(1, 100)的调用,它是一个mutator 方法。一个很好的概述:nedbatchelder.com/text/names.html -
"但不能完全替换阵列。"这没有任何意义。这不是 python 变量的工作方式。变量是指给定命名空间中的对象的名称。您可以更改名称所指的内容,但这不会“替换”对象。您可以将变量视为可以放置在对象上的名称标签,并且可以随意移动而不改变实际对象的任何内容
-
这能回答你的问题吗? Short description of the scoping rules?