欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-09 22:29:08
...

在写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)

那么很不幸,会报错:
python合并列表以及函数内部使用全局变量的一些坑
因为我删除了第一个元素后就只有两个元素了,访问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合并列表以及函数内部使用全局变量的一些坑
原因:如果我们在一个函数中改变了某个全局变量的值,那么Python会把该变量当成局部变量处理。
解决:在函数开始写上:

global C

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