列表只返回最后一次迭代

2024-06-28 19:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个具有不同随机权重的邻接矩阵的总体,我正在使用下面的代码。然而,我的问题是,在运行这个时,所有的权重都是列表的最后一次迭代的权重?在生成过程中打印这些adjacencylists时,它可以正常工作,但是getPopulation函数的输出是相同参数集的5倍。你知道吗

感觉这将是一个简单的修复,但有些东西(我认为可能是非常基本的)丢失了。可能是需要深度拷贝的地方出了问题?你知道吗

已经尝试使用普通for循环、print语句等

import networkx as nx
import numpy as np

G = nx.DiGraph()
G.add_nodes_from(["Sadness", "Avoidance", "Guilt"])
G.add_edges_from([("Sadness", "Avoidance")], weight=1)
G.add_edges_from([("Avoidance", "Sadness")], weight=1)
G.add_edges_from([("Avoidance", "Guilt"), ("Guilt", "Sadness")], weight=1)
parameters = nx.to_numpy_matrix(G)

def getRandParamValue(adj):
    for p in np.transpose(adj.nonzero()):
        adj[p[0], p[1]] = adj[p[0], p[1]] * np.random.uniform()
    print(adj)
    return adj

def getPopulation(size, initParam):
    return [getRandParamValue(initParam) for i in range(size)]

getPopulation(5, parameters)

在getRandParamValue函数中打印输出时,它可以正常工作:

[[0.         0.40218464 0.        ]
 [0.07330473 0.         0.7196376 ]
 [0.53148413 0.         0.        ]]
[[0.         0.34256617 0.        ]
 [0.01773899 0.         0.12460768]
 [0.1401687  0.         0.        ]]
[[0.         0.11086942 0.        ]
 [0.01449088 0.         0.04592752]
 [0.07903259 0.         0.        ]]
[[0.         0.01970867 0.        ]
 [0.00589168 0.         0.00860802]
 [0.06942081 0.         0.        ]]
[[0.         0.01045412 0.        ]
 [0.00084878 0.         0.00713334]
 [0.0024654  0.         0.        ]]

但是,getPopulation的输出与前一个输出不同,这应该是意料之中的:

[matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]]),
 matrix([[0.        , 0.01045412, 0.        ],
         [0.00084878, 0.        , 0.00713334],
         [0.0024654 , 0.        , 0.        ]])]

参数矩阵如下:

[[0. 1. 0.]
 [1. 0. 1.]
 [1. 0. 0.]]

Tags: fromaddfornpmatrix权重nxweight
1条回答
网友
1楼 · 发布于 2024-06-28 19:21:23

所以问题是:

def myfunction(L):
    L[0] += 1
    return L

my_outer_list = [1,2,3]
newlist = myfunction(my_outer_list)

print(newlist)
> [2, 2, 3]
print(my_outer_list)
> [2, 2, 3]

newlist[2]=-1
print(newlist)
> [2, 2, -1]
print(my_outer_list)
> [2, 2, -1]

我已将对象my_outer_list传递给函数。然后修改该对象,并返回该对象。所以现在newlistmy_outer_list不仅仅是相等的,它们是同一事物的两个不同名称。我对那个对象所做的事情改变了对象,不管你用哪个名字,你都能看到这些变化。你知道吗

你就是这样。如果我让myfunction返回L.copy(),它将返回L的副本,而不是确切的L。你知道吗

所以你应该返回adj.copy()。你知道吗

相关问题 更多 >