gpt4 book ai didi

python - 更新Python函数中引用的变量

转载 作者:行者123 更新时间:2023-12-01 08:45:34 26 4
gpt4 key购买 nike

我正在尝试通过类 P 更改矩阵 X 的顺序,该类已传递给基类 B 中的函数。顺序的更改不会反射(reflect)在基类 B 中。有没有办法达到这个目的吗?请参阅以下 MWE:

#p.py
import numpy as np
import b

class P(b.B):

def __init__(self, opts):
self.opts = opts

def func1(self, X):

print('func1:',X)

def func2(self):

randomize = np.arange(len(self.myX))
np.random.shuffle(randomize)
self.myX = self.myX[randomize]

print('func2',self.myX)

def func3(self, X):
"""
X is a 2d matrix
"""
self.myX = X
#call the function from the base class
b.B.func3(self, self.myX)

#b.py
class B:
"""
base class.

"""
def __init__(self, opts):
self.opts = opts


def func3(self, X):

for n in range(2):
for i in range(X.shape[0]):
self.func1(X[i])
self.func2()

从控制台:

p1 = p.P({})
X=np.array([[1,2,3], [2,3,4], [3,4,5], [4,5,6], [5,6,7], [6,7,8]])
p1.func3(X)

当前输出:

func1: [1 2 3]
func1: [2 3 4]
func1: [3 4 5]
func1: [4 5 6]
func1: [5 6 7]
func1: [6 7 8]
func2 [[6 7 8]
[3 4 5]
[2 3 4]
[5 6 7]
[4 5 6]
[1 2 3]]
func1: [1 2 3]
func1: [2 3 4]
func1: [3 4 5]
func1: [4 5 6]
func1: [5 6 7]
func1: [6 7 8]

预期输出:

func1: [1 2 3]
func1: [2 3 4]
func1: [3 4 5]
func1: [4 5 6]
func1: [5 6 7]
func1: [6 7 8]
func2 [[6 7 8]
[3 4 5]
[2 3 4]
[5 6 7]
[4 5 6]
[1 2 3]]
func1: [6 7 8]
func1: [3 4 5]
func1: [2 3 4]
func1: [5 6 7]
func1: [4 5 6]
func1: [1 2 3]

所以基本上,当控件从 B 中的 p.func2 返回到 func3 时,X 应该与 self.myX 相同。我相信这应该发生,因为 self.myX 默认情况下是通过引用 b.func3 传递的。

最佳答案

问题出在这里:

#class p.P
def func2(self):

randomize = np.arange(len(self.myX))
np.random.shuffle(randomize)
self.myX = self.myX[randomize] # <-- this line

print('func2',self.myX)

您有效地将 self.myX 重新分配给随机 np 数组,将对象引用从 X 更改为这个新的随机数组。

如果您在此行之间添加了 print(id(self.myX)),您会注意到初始引用点回到了 X,但是一旦您重新分配它的 id 不再相同。

您应该这样做来维护引用:

np.random.shuffle(self.myX)

如果您确实也想对内部数组进行洗牌:

for arr in self.myX:
np.random.shuffle(arr)
np.random.shuffle(self.myX)

这也将保留引用。

编辑:如果您希望在保留对象的同时保留随机顺序的引用,则有点棘手但可行:

# use make randomize an instance attribute so you can refer to it even after the function ended
self.shuffle_order = np.arange(len(self.myX))
np.random.shuffle(self.shuffle_order)

# loop through each inner array and reassign based on a copy of the shuffled matrix
for i, arr in enumerate(self.myX[self.shuffle_order]):
self.myX[i] = arr

这会更改内部数组,但会保留 self.myXX 之间的整体对象引用。

之后您可以通过p1.shuffle_order检索订单。

关于python - 更新Python函数中引用的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com