為什么我們在這些 np.array 上有兩種不同的行為?
def pass_by_ref(A: np.array):
A = np.ones((2,2))
return A
def pass_by_ref_sideEffect(A: np.array):
A[0][0] = 2
return A
A = np.zeros((2,2))
B = pass_by_ref(A)
print("A =\n", A)
print("B =\n", B)
C = pass_by_ref_sideEffect(A)
print("A =\n", A)
print("C =\n", C)
輸出:
A =
[[0. 0.]
[0. 0.]]
B =
[[1. 1.]
[1. 1.]]
A =
[[2. 0.]
[0. 0.]]
C =
[[2. 0.]
[0. 0.]]
為什么我們在 pass_by_ref_sideEffect 之后對 A 有副作用,而不是 pass_by_ref?
uj5u.com熱心網友回復:
這與您傳遞變數的方式無關,而與分配的作業方式無關。在pass_by_ref()這一行A = np.ones((2,2))中創建一個新陣列并將其分配給本地名稱A。原始陣列物件仍然存在,但A不再參考它。在另一種情況下,您通過分配給它的一個元素來操作原始陣列A[0][0] = 2。
如果您想在第一種情況下產生副作用,則分配給 A 的切片,如下所示:
def pass_by_ref(A: np.array):
A[:,:] = np.ones((2,2))
return A
A = np.zeros((2,2))
B = pass_by_ref(A)
print(A)
[[1., 1.],
[1., 1.]]
print(B)
[[1., 1.],
[1., 1.]]
這是一個示例,無需將變數傳遞給函式就可以證明這一點:
In [1]: import numpy as np
In [2]: A = np.zeros((2,2))
In [3]: B = A
In [4]: B
Out[4]:
array([[0., 0.],
[0., 0.]])
In [5]: A[:,:] = np.ones((2,2))
In [6]: B
Out[6]:
array([[1., 1.],
[1., 1.]])
uj5u.com熱心網友回復:
當 Python 呼叫該函式時,它會傳遞物件的參考。用于A[0][0] = 2賦值時,會根據 variable 所指向的物件的地址進行偏移A,找到要寫入的地址。但是,如果你使用A = np.ones((2, 2)),將創建一個新陣列并將變數A指向它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464622.html
