嗨,我似乎在理解通过Python引用传递对象方面遇到问题。我了解示例1的输出,但是示例2不应以类似的方式运行并且不更改A矩阵吗?
def reassign(list):
list = [0, 1, 2]
list = [3]
reassign(list)
print(list)
Returns: [3]
import numpy as np
A = np.ones((4,4))
def xyz(A):
for i in range(4):
A[i,i] = 0
return None
x = xyz(A)
print(A)
# Returns
[[0. 1. 1. 1.]
[1. 0. 1. 1.]
[1. 1. 0. 1.]
[1. 1. 1. 0.]]
答案 0 :(得分:0)
通过引用传递意味着,当您将变量传递给函数时,您没有传递变量本身,而是将指针传递给了变量,即从外部到内部复制。在示例1中,您将list
传递给该函数,该函数是指向包含元素[3]
的列表的指针。但是,紧接着之后,您将变量保存到列表的指针,并在其中放入新指针,以指向包含元素[0, 1, 2]
的新列表。请注意,您没有更改开始的列表-您更改了引用该变量的变量。当您退出该函数时,传递给该函数的变量(仍然是指向第一个列表的指针)没有改变-它仍指向包含元素[3]
的列表。
在示例2中,您将A
传递到xyz()
中。而在示例1中,您按照
A = something_else
在这里,你在做
A[i] = something_else
这是完全不同的操作-您无需更改保存列表所指向的变量,而是通过更改列表元素之一来更改列表本身。而不是使A
指向其他对象,而是通过取消引用来更改A
指向的值。