Python中循环后使用list.append()数据被覆盖问题的解决

前言

最近发现一个问题,在一次爬虫实战中,需要将字典加入列表中,意外的情况出现了!!!下面简单分析一下出现的状况:

list = []
dic = {}
for i in range(5):
 dic['num'] = i
 list.append(dic)
 print(id(dic))
print(list)
136652096
136652096
136652096
136652096
136652096
[{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]

结果出乎意料,并不是我们简单认为的

[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]

用我自己的理解是:

如上图,每一个dic都给list一个位置,但你的dic在循环外,也就说每次循环你给的都是一个地址,dic的值改变,新一次的循环值就会覆盖上一次循环的值,list取到的值也改变。

正确做法:

list = []
for i in range(5):
 dic = {}
 dic['num'] = i
 list.append(dic)
 print(id(dic))
print(list)
138383888
136652192
138383408
138384272
138383792
[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]

正确做法是将dic放入循环内,这样每次循环都会是一个新的dic,分配不同的地址。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • python将txt文档每行内容循环插入数据库的方法

    如下所示: import pymysql import time import re def get_raw_label(rece): re1 = r'"([\s\S]*?)": "' #-------------正则表达式 reg1 = re.compile(re1) # ------------编译一下 str1 = reg1.findall(rece) return str1 def get_detail(rece): re2 = r'": "([\

  • Python创建一个空的dataframe,并循环赋值的方法

    如下所示: # 创建一个空的 DataFrame df_empty = pd.DataFrame() #或者 df_empty = pd.DataFrame(columns=['A', 'B', 'C', 'D']) #添加数据 a为一个新的dataframe df_empty = df_empty.append(a) 以上这篇Python创建一个空的dataframe,并循环赋值的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python在for循环中更改list值的方法【推荐】

    一.在for循环中直接更改列表中元素的值不会起作用: 如: l = list(range(10)[::2]) print (l) for n in l: n = 0 print (l) 运行结果: [0, 2, 4, 6, 8] [0, 2, 4, 6, 8] l中的元素并没有被修改 二.在for循环中更改list值的方法: 1.使用range l = list(range(10)[::2]) print (l) for i in range(len(l)): l[i] = 0 print (l

  • python for循环输入一个矩阵的实例

    代码如下: a=[] for i in range(3): a.append([]) for j in range(3): a[i].append(int(input('输入整数:\n'))) print(a) 结果如下: 输入整数: 1 输入整数: 2 输入整数: 3 输入整数: 4 输入整数: 5 输入整数: 6 输入整数: 7 输入整数: 8 输入整数: 9 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 以上这篇python for循环输入一个矩阵的实例就是小编分享给

  • python中for循环输出列表索引与对应的值方法

    如下所示: list = ['a','b','c'] 想用for循环输出list的元素以及对应的索引. 代码及结果如下: 以上这篇python中for循环输出列表索引与对应的值方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python for循环中的陷阱详解

    前言 Python 中的 for 循环和其他语言中的 for 循环工作方式是不一样的,今天就带你深入了解 Python 的 for 循环,看看它是如何工作的,以及它为什么按照这种方式工作. 循环中的陷阱 我们先来看一下 Python 循环中的「陷阱」,在我们了解了循环的工作方式后,再来看下这些陷阱到底是怎么出现的. 陷阱 1:循环两次 现在我们先假设有一个数字组成的列表,和一个用于返回这些数字的平方的生成器: >>> nums = [1, 2, 3, 4] >>> sq

  • python中退出多层循环的方法

    1.定义标记变量:利用变量值的变化退出循环 # 第一种嵌套形式 a = [[1, 2, 3], [5, 5, 6], [7, 8, 9]] # init_i = 0 # init_j = 0 flag = True for i in range(3): for j in range(3): # print(i, j) if a[i][j] == 5: flag = False init_i = i init_j = j break if not flag: break print(init_i,

  • Python之循环结构

    while循环结构 格式: while 表达式: 语句块 执行流程:当程序执行到while语句时,首先判断表达式的真假.若表达式的值为真,则执行缩进的语句块,之后返回表达式继续判断:若表达式的值为假,则跳过缩进的语句块执行. 说明: 表达式:也叫循环条件 语句块:也叫循环体 死循环:循环条件一直成立 break:跳出循环 continue:结束本次循环,进入下次循环 else:对应的语句块,循环正常退出时会执行,非正常退出(break)时不执行. for-in循环结构 说明: 也是一种循环结构,

  • Python通用循环的构造方法实例分析

    本文实例讲述了Python通用循环的构造方法.分享给大家供大家参考,具体如下: 1.交互循环 是无限循环的一种,允许用户通过交互的方式程序的特定部分: def main(): sum =0.0 count =0 moredata ='yes' #字符串 while moredata[0] =='y': #获取字符串第一个字符,true执行下面的 x =eval(input('enter a number>>')) sum =sum+x count = count +1 moredata =in

  • Python的for和break循环结构中使用else语句的技巧

    在Python中的while或者for循环之后还可以有else子句,作用是for循环中if条件一直不满足,则最后就执行else语句. for i in range(5): if i == 1: print 'in for' else: print 'in else' print 'after for-loop' # in for # in else # after for-loop 但我们发现if条件在循环的过程中成立了,最终还是执行了else语句里的内容,这是为什么呢? 好的,我们这时看下面这

随机推荐