Python 通过引用传递对象混淆

Python passing object by reference confusion

嗨,我似乎对 Python 中通过引用传递对象的理解有问题。我理解示例 1 的输出,但示例 2 不应该以类似的方式运行并且不更改 A 矩阵吗?

示例 1:

def reassign(list):
  list = [0, 1, 2]

list = [3]
reassign(list)
print(list)

Returns: [3]

示例 2:

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.]]

通过引用传递意味着,当您将变量传递给函数时,您不传递变量本身,而是将指针传递给 变量,从函数外复制到函数内。在示例 1 中,您将 list 传递给函数,它是指向包含元素 [3] 的列表的指针。但是紧接着,您将保存指向列表的指针的变量,并在其中放入一个新指针,指向包含元素 [0, 1, 2] 的新列表。请注意,您没有更改您开始时使用的列表 - 您更改了引用它的变量 所引用的内容。当您退出函数时,您传递给函数的变量(仍然是指向第一个列表的指针)没有改变——它仍然指向包含元素 [3] 的列表。

在示例 2 中,您将 A 传递给 xyz()。而在示例 1 中,您按照

的方式做了一些事情
A = something_else

这里,你在做

A[i] = something_else

这是一个完全不同的操作 - 不是更改保存列表的变量所指向的内容,而是更改列表本身 - 通过更改其元素之一。您不是让 A 指向别的东西,而是通过取消引用来更改 A 指向的值。