Jupyter Notebook中Python的append()循环重复追加问题求助
Jupyter Notebook中Python append()重复运行单元格时列表不断追加的问题
问题描述
- 从字符串提取字母存入列表
ltr; - 为
ltr的每个元素设置判断条件,将布尔结果存入ltr_spec列表; - 手动初始化
ltr_spec后首次运行正常,但重复运行单元格时,ltr_spec会不断追加新元素,未像ltr那样被重置为空列表; - 附示例代码及多次运行的输出结果,疑问:这是循环、
append()还是Jupyter Notebook的问题?
示例代码
s ='Qm1p4Q7p5d2' ltr = [] # 测试'ltr'的每个元素是否符合字符串中字母的规范 ltr_j = False ltr_spc = [] for i in s: if i.isalpha(): ltr.append(i) # 利用模运算(数学概念)定位字母的位置 if (len(ltr) % 3 == 0): for j in range(len(ltr)): # 测试ltr列表的索引、字母及大小写规范 if ((j % 3 == 0 and ltr[j] == "Q") or # 请教有没有不用Numpy替代R中j %in% c(1,2)的写法! (j % 3 == 1 and ((ltr[j] == "d" and ltr[j+1] == "p") or (ltr[j] == "p" and ltr[j+1] == "d"))) or # 请教下面的条件是否多余,因为上面已经检查过相关条件了.. (j % 3 == 2 and ((ltr[j] == "d" and ltr[j-1] == "p") or (ltr[j] == "p" and ltr[j-1] == "d")))): ltr_j = True else: ltr_j = False ltr_spec.append(ltr_j)
运行输出
首次运行输出
ltr ['Q', 'm', 'p', 'Q', 'p', 'd'] ltr_spec [True, False, False, True, True, True]
第二次运行输出
ltr ['Q', 'm', 'p', 'Q', 'p', 'd'] ltr_spec [True, False, False, True, True, True, True, False, False, True, True, True]
第三次运行输出
ltr ['Q', 'm', 'p', 'Q', 'p', 'd'] ltr_spec [True, False, False, True, True, True, True, False, False, True, True, True, True, False, False, True, True, True]
问题原因与解决方法
这是Jupyter Notebook的变量生命周期特性导致的,和循环、append()本身无关。
Jupyter的所有单元格共享同一个Python内核会话,变量会在内存中持续保留。你的代码里写了ltr_spc = [],但实际操作的列表是ltr_spec——第一次运行时,Python会自动创建ltr_spec变量并执行追加;之后每次运行单元格,你都没有重新初始化ltr_spec为空列表,而是直接在已有列表的基础上继续追加元素,所以列表会越来越长。
而ltr每次运行都会被明确赋值为[],因此每次都会被重置为空,不会累积元素。
解决方法:把代码里的ltr_spc = []改成ltr_spec = [],确保每次运行单元格时都重新初始化这个列表。
代码附带疑问解答
- 替代R中
j %in% c(1,2)的写法:可以直接用j % 3 in (1, 2),或者1 <= j % 3 <= 2,完全不需要依赖Numpy。 j%3==2的条件确实冗余:当j%3==1时已经验证了j和j+1的关系,而j%32的情况就是j-1%31的场景,之前的判断已经覆盖了该逻辑,所以这个条件可以删除,不影响最终结果。
内容的提问来源于stack exchange,提问作者Jane Lu
相关产品推荐
相关产品推荐

