python合并列表以及函数内部使用全局变量的一些坑
程序员文章站
2022-03-09 22:29:08
...
在写agnes算法时,碰到了一些坑,记录如下:
- 对于一个二维列表,我想合并里面两个列表。比如初始二维列表为:
[[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。