python合并列表以及函数内部使用全局变量的一些坑

在写agnes算法时,碰到了一些坑,记录如下:

  1. 对于一个二维列表,我想合并里面两个列表。比如初始二维列表为:
 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

合并后为:

[[4, 5, 6], [1, 2, 3, 4, 5, 6]]

最开始的操作如下:

test = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
merge = test[0].extend(test[1])
del test[0]
del test[1]
test.append(merge)

输出test为:

[[4, 5, 6], None]

后来查阅资料发现extend的返回值并不是合并后的列表,啥也不是

解决:直接将两个列表相加

test = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
merge = test[0] + test[1]
del test[0]
del test[1]
test.append(merge)

输出为:

[[4, 5, 6], [1, 2, 3, 4, 5, 6]]

反思:看似写的正确,其实存在很大隐患,因为我是按照顺序合并的,假如我要合并第一个和第三个列表:

test = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
merge = test[0] + test[2]
del test[0]
del test[2]
test.append(merge)

那么很不幸,会报错:
在这里插入图片描述
因为我删除了第一个元素后就只有两个元素了,访问test[2]很显然就是不合法的。
正确做法:

test = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
merge = test[0] + test[2]
test = [test[x] for x in range(len(test)) if x != 0 and x != 2]
test.append(merge)

输出:

[[4, 5, 6], [1, 2, 3, 7, 8, 9]]

2.在某个函数内改变了全局变量的值

def agnes():
    while len(C) > cluster_Num:
        i, j =find_Two_cluster()
        merge = C[i] + C[j]
        C = [C[t] for t in range(len(C)) if t != i and t != j]
        C.append(merge)

    for i in range(len(C)):
        X = []
        Y = []
        for j in range(len(C[i])):
            X.append(x[C[i][j]])
            Y.append(y[C[i][j]])
        plt.scatter(X, Y, c=color[i])

    plt.legend(['C1', 'C2', 'C3', 'C4'])
    plt.title('agnes')

    plt.show()

上述函数agnes中C是一个全局变量,运行后报错:
在这里插入图片描述
原因:如果我们在一个函数中改变了某个全局变量的值,那么Python会把该变量当成局部变量处理。
解决:在函数开始写上:

global C

上面这句话表面函数里面使用的C就是全局变量C。

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/107907586