齐乐娱乐

【不一样的Python】矩阵转换窥探dict.clear()和赋值[]间的区别

${website.getHeaderOriginal(${article.taxonomyName})}




事情起因

事情的起因是这样的: 最近在深入研究python底层工作原理··|,最好的方式是看源代码··|,但太过庞大无人下手··|,因此从小项目入手看起来是更好的方式之一··|--。在多种方法尝试 矩阵转换时··|,发现有个奇怪的现象··|,对列表不同的赋值方式会引导天壤之别的结果··|--。


情景还原

  • 我们要转换矩阵··|,代码如下:

lst = [[1,0,4],[2,3,1],[5,1,4]]
m = len(lst) #列
n = len(lst[0]) #行
tsl = []
tmp = []
for i in range(n): #行
   for j in range(m):  #列
       tmp.append(lst[j][i])
   tsl.append(tmp)
   tmp.clear()
print(tsl)



  • 结果

结果让我很是不解··|,按我以前的理解··|,这里我只是原地修改··|,清空tmp列表中所有元素··|,但对tsl不做任何变更··|,且tsl列表是append添加tmp列表中元素··|--。百思不得其解··|,难道问题出在tmp.clear()函数上|-··?

DEBUG!!!

  1. 第一步:我们先将tmp.clear()注释··|,确定病因

  1. 第二步:修改tmp.clear()方法为 tmp = []

lst = [[1,0,4],[2,3,1],[5,1,4]]
m = len(lst) #列
n = len(lst[0]) #行
tsl = []
tmp = []
for i in range(n): #行
   for j in range(m):  #列
       tmp.append(lst[j][i])
   tsl.append(tmp)
   #tmp.clear()
   tmp = []  ### 这里我们换了一种清空列表的方式
print(tsl)

结果如我们所愿,但问题是什么呢|-··?为什么会这样|-··? tmp.clear() 和 []赋值之间有什么区别呢|-··?

  1. 第三步:研究tmp.clear()[]的区别
    对此过程··|,我们只能打印整个数据流··|,才能搞清楚这中间的缘由··|,因此我们优化代码如下:

lst = [[1,0,4],[2,3,1],[5,1,4]]
m = len(lst) #列
n = len(lst[0]) #行
tsl = []
tmp = []
for i in range(n): #行
   for j in range(m):  #列
       tmp.append(lst[j][i])
   tsl.append(tmp)
   #tmp = []
   print("BeforeClearTmp:",tmp)
   print("Beforetls:",tsl)
   #tmp.clear()
   tmp = []
   print("AfterClearTmp:",tmp)
   print("AfterTls:",tsl)
print(tsl)



分别得出tmp.clear()[]整体数据流向

大家会发现··|,tmp.clear()方法每次执行的时候··|,tsl列表也随之会被清空··|--。难道ts使用append方法并没有真正将元素复制到列表中··|,而只是引用的方式吗|-··?

好吧··|,我们通过下面案例如验证我们的想法:

而为什么使用 tmp = [] 则tsl的元素列表不会被修改呢|-··?那是因为tmp = [] 方式是在内存中重新开辟了一块空间全存储tmp··|,即这里的tmp元素已经是一个全的列表了哦··|--。

好了··|,关于python下 clear() 方法和 []赋值有什么区别··|,大家应该有所了解了吧|-··?留一个小练习吧··|--。

尝试验证clear()方法和{}赋值的区别

朋友们··|,下期见








${website.getFooterOriginal(${article.taxonomyName})}

发布者 :齐乐娱乐_www.qile518.com_齐乐娱乐官网 - 分类 齐乐娱乐