在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也先在回复中提到了它
在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也先在回复中提到了它