你在这里混合了几件事。
首先,M = 2 创建一个名为M 的局部变量(您可以在locals() 中看到它)并阻止您稍后访问原始M(尽管您'没有这样做......但只是为了说明一点)。这有时被称为"shadowing"。
其次,np.array 是一个可变 对象(与immutable object 相反),对它的更改将反映在对它的任何引用中。 glob 函数中的内容是对 M 的引用。
您可以将np.array 视为具有许多名称的内存,如果您更改了它,无论您使用什么名称访问它,更改都会很明显。 M[0] 只是对该内存特定部分的引用。这反映了对象的“状态”。
如果你想做这样的事情:
M = np.array([1])
def example()
another_name_for_M = M
M = 2
another_name_for_M[0] = 2
您仍会看到全局 M 发生变化,但您正在使用新名称来访问它。
如果您使用string、tuple、frozenset 等,它们都是不能(轻松)更改的不可变对象,您不会能够真正改变他们的状态。
现在回答您的问题,如果您不希望函数改变数组,只需使用 np.copy 发送它的 copy,而不是实际的:
import numpy as np
my_array = np.array([1])
def array_mutating_function(some_array):
some_array[0] = 1337
print some_array # prints [1337]
# send copy to prevent mutating the original array
array_mutating_function(np.copy(my_array))
print my_array # prints [1]
这将有效地使其在外部范围内不可变,因为函数不会引用它,除非它在外部范围内使用它的名称,无论如何这可能不是一个好主意。
如果函数不应该更改任何数组,无论发送什么数组,都将要在函数内部制作的副本移动,防止它更改发送给它的任何数组:
def array_mutating_function(some_array):
some_array = np.copy(some_array)
some_array[0] = 1337