在Python中,函数内变函数外对象的操作原理是什么?

In Python, what is the operating principle to change from within a function an object outside of a function?

在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)

Python 作用域按照 LEGB 顺序进行,首先检查本地作用域、封闭作用域、全局作用域和内置作用域 当您在数组元素内搜索时,python 搜索现有变量并引用它,因为函数作用域内没有变量,它会在作用域中向上移动

def fun3():
    c[0] = 0
    return

fun3 会打印错误 C is not defined 不会使 c = [0], 它会尝试在局部范围内(在本例中的函数内)首先找到变量 C,然后它会在每次搜索的范围内上升

但是当你执行 b = 1.1 时,它会直接分配变量,它优先考虑局部范围并简单地在函数内定义它的值

def fun5():
     b = -1.1
     print(b) # prints local value, -1.1
     return
print(b) #prints original array)

同时

def fun6():
    b = [2,3,4]
    b[1] = 500
    print(b) #would print [2,500,4]
    return
print(b) #would print original array

现在在 fun6 中,因为新的 b 数组在作用域内,b[1] 操作首先引用本地作用域,它们只更改本地数组而不更改原始 b 数组,这是因为它更接近对 b 的引用在本地范围内。如果您注释第一行,下一个更接近的引用将是文件开头声明的原始 b 因此更改将影响该范围的变量 b

用户juanpa.arrivillaga也先在回复中提到了它