首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python面试题目之(针对dict或者set数据类型)边遍历 边修改 报错dictionary changed size during iteration

RuntimeError: dictionary changed size during iteration # 字典在迭代的时候改变了字典大小  python 遍历一个dict、set类型的同时...,并且在改变这个变量的长度或者一边遍历一边修改,这时候就会抛出这错误;  我查了一些资料之后, 才发现用for in 迭代的时候是用迭代器的, (或许是个链表?)..., 不能在迭代的时候添加或删除属性, 只能更改属性值....,从而得到一个列表,这样可以一边遍历列表一遍修改字典; # 但是这个方法在python3中无法使用,因为这时候按照遍历 dictVar.keys(),返回一个迭代器而不再是一个列表,所以这个时候把字典作为参数放到...list方法内,这样才能返回一个列表; ?

2K20

python 字典的内部实现原理介绍

python 的字典内部使用的数据结构是 hash 表 一、hash 表相关概念 哈希表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。...在 dict 的散列表当中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,另一个是对值的引用。因为所有表元的大小一致,所以可以通过偏移量来读取某个表元。...Python 首先会调用hash(search_key)来计算 search_key 的散列值,把这个值最低的几位数字当作偏移量,在散列表里查找表元(具体取几位,得看当前散列表的大小)。...如果你在迭代一个字典的所有键的过程中同时对字典进行修改,那么这个循环很有可能会跳过一些键——甚至是跳过那些字典中已经有的键。 由此可知,不要对字典同时进行迭代和修改。...如果想扫描并修改一个字典,最好分成两步来进行:首先对字典迭代,以得出需要添加的内容,把这些内容放在一个新字典里;迭代结束之后再对原有字典进行更新。

4.4K32
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    redis 字典的实现

    ,used是当前使用的大小,size会根据当前used的大小来做相应的调整,调整的过程就是字典动态扩容的过程,具体过程下面会描述。...因为在rehash中的任何时刻,一个节点只能存在其中一张哈希表中,所以每次操作都需要处理两张表。 迭代器 redis里面的字典实现了两种迭代器,一种是安全的迭代器,一种是普通的迭代器。...所谓安全就是指在迭代的过程中可以执行添加查找等操作,非安全的迭代器就是只能执行迭代操作。...其实本质上就是安全的迭代器会给dict设置iterators++(dict里面的变量),这样字典的各种操作就不会执行rehash操作,如果在迭代的过程中执行了rehash,迭代索引就会错乱。...,非安全的迭代器在初次迭代的时候会计算一个哈希值,释放迭代器的时候assert这个哈希值是否被改变了。

    1.4K00

    Python|有趣的shuffle方法

    也就是说,它改变了列表中项目的位置。我们称之为随机化列表中的元素。...后的字符串列表: ['满意', 'Gimme Shelter', 'Paint It Black', '你不能总是得到你想要的东西', '同情魔鬼'] 这个和上面的那个例子是一样的。...,没有返回任何内容。...random.sample()方法返回新列表,其中包含传递给它的样本大小。如果我们传递的示例大小与列表的大小相同,它将返回新列表,该列表是原始列表的无序版本。让我们用一个例子来做这个。...7、在Python中随机播放字典 在python中不可能修改字典。但是,我们可以重新排列字典键的迭代顺序。从字典中提取所有键并将其添加到列表中,无序排列该列表并使用新无序排列的键访问字典值。

    3.3K10

    Python入门(11)

    3、字典的增、删、改、查:【增】 我们可以直接或通过dict.setdefault()方法,向字典追加键值对。 ? 说明: 1、直接通过给新的键赋值的方法,可以直接为字典追加新的键值对。...3、如果dict.setdefault()方法追加的键已经存在,则不会追加,仅返回该键对应的值 4、字典的增、删、改、查:【删】 使用del、pop()和clear()方法,可以删除一个或全部的键值对。...5、字典的增、删、改、查:【改】 通过指定键或update()函数的方法,可以直接间接地修改某个键值对。 ? 说明: 1、字典通过指定键方法可以直接修改对应的值。...8、字典的迭代 使用for key in dict迭代语句,可以方便地遍历一个字典的所有键值对。 ? 9、字典的合并 在python3中,使用update()函数即可轻松实现两个字典的合并。 ?...10、字典的排序 在python中,字典看起来是无序的,使用sorted()函数可实现排序。 ? 函数sorted()对所有可迭代的对象进行排序。

    2K30

    这些python3的小知识点你都知道吗?

    ,使用nonlocal关键字; 21、递归 函数调用自身 设置了正确的返回条件 22、字典 字典不支持一键多值。...23、fromkeys() fromkeys方法是直接创建一个新的字典,不要试图使用它来修改一个原有的字典,因为它会直接无情的用把整个字典给覆盖掉。...33、super()函数 super()函数的超级之处在于你不需要明确的给出任何基类的名字,它会自动的帮你找出所有的基类以及对应的方法,由于你不用给出基类的名字,这就意味着你如果需要改变了类继承关系,...f = something(f) 38、魔法方法 魔法方法总是被双下划线包围,例如 init(), init() 方法的返回值一定是None,不能是其它。当重写init() 方法时一定不能忘记。...generator 是用来产生一系列值的 yield 则像是 generator 函数的返回结果 yield 唯一所做的另一件事就是保存一个 generator 函数的状态 generator 就是一个特殊类型的迭代器

    65160

    Python2和3的区别

    Python3是未来的大势所趋,2.7现在只是在维护,不会增加新的功能。 接下来,我把2和3的主要区别整理一下分享给大家,有一部分参考了网上,我结合自己的理解和分析,希望可以帮到大家。...2.类型比较 当比较两个变量的时候,比如x返回bool结果。...x<y Exception as e: print(e) print fun1([1],2) False 很明显x是列表,而2是整形,二者根本不能比较,py2直接返回...字符串也就是文本,这个问题一直在py2里面没有很好的处理。在py3里面彻底的解决了。Python3最重要的改动除了print,大概要算是对文本和二进制数据作了更为清晰的区分。...文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。 4.输入函数改变了。 ? 5.赋值变量,扩展的可迭代解包 ? 6.异常处理 ? ? ? 7.字典 ? 8.高阶函数 ?

    1.3K20

    RecyclerView零点突破(动画+边线篇)

    mPendingAdditions.isEmpty(); //additionsPending为false可导致直接返回,不执行动画 if (!removalsPending && !...public long getAddDuration() { return mAddDuration; } ---- 1.2:自定义添加动画 1.2.1:定点旋转 既然分析到它是怎么动起来的,当然可以改一下...,比如: 注意:animateAddImpl里的动画是在移动结束后调用的 ?...ViewPropertyAnimator用得不怎么爽,还是用AnimatorSet+ObjectAnimator吧 用AnimatorSet装一下效果,可以实现更复杂的多动画叠加,然后添加监听,和源码保持一致 一直想做条目抖动效果,总是实现了...,item的动画也不是很难 貌似有个动画库,个人感觉没有必要,拿DefaultItemAnimator稍微改几句就行了 毕竟需求是不断变动的,一个库不可能涵盖所以需求,而且很多用不到的特效还占空间

    1K20

    Python:说说字典和散列表,散列冲突的解决原理

    散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。在一般书中,散列表里的单元通常叫做表元(bucket)。...在 dict 的散列表当中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对值的引用。因为每个表元的大小一致,所以可以通过偏移量来读取某个表元。...(具体取几位,得看当前散列表的大小)。...,但如果 key1 和 key2 散列冲突,则这两个键在字典里的顺序是不一样的。...这个过程中可能发生新的散列冲突,导致新散列表中键的次序变化。如果在迭代一个字典的同时往里面添加新的键,会发生什么?不凑巧扩容了,不凑巧键的次序变了,然后就 orz 了。

    2K30

    16道面试官必问你必须会的iOS面试题

    在 block 中先写一个 strong self,其实是为了避免在 block 的执行过程中,突然出现 self 被释放的尴尬情况。...剩下我们要做的,就是在引用计数变成 0 的时候,去这个全局的字典里面,找到所有的 weak 指针,将其值设置成 nil。如何做到这一点呢?Friday QA 上介绍了一种类似 KVO 实现的方式。...当对象存在 weak 指针时,我们可以将这个实例指向一个新创建的子类,然后修改这个子类的 release 方法,在 release 方法中,去从全局的 CFMutableDictionary 字典中找到所有的...接下来让我们来看第一问,在同学的回复中,我看到很多人用第二问的办法,把数组整个另外保存一份,然后再记录一个下标,每次返回其中一个。这个方法当然是可行的,但是大部分的迭代器通常都不会这么实现。...,有一个机制来定期检查外部的变量是否有变化,而要做到这一点,需要改 block 执行中的代码。

    2.7K50

    【Swift】学习笔记(四)——设置(Collection)

    ”test3”] 插入到某一个位置:aa.insert(“test2”,atIndex:0) 获取某一项:下标 var tt = aa[0] 改动: aa[0] = “new test” 还能够批量改...aa[4…6] = [“a”,”b”] 删除项:var removeItem = aa.removeAtIndex(0) 被移除的项会返回出来。...当然定义为let类型就不可变了。。 字典,也就是键值对。...var aa = Dictionary () 清空数据 aa = [:] //比数组多了一个:号 读取: 1、字典大小 aa.count count属性 2...在for循环中讨论. swift不像oc那样只在C语言的基础上外包一层面向对象,它真的很灵活也和其它的编程语言语法很相似。要使用它easy的。 版权声明:本文博客原创文章,博客,未经同意,不得转载。

    62610

    redis之rehash原理

    字典的结构 在 Redis 中所有的 key 都存储在一个很大的字典中,这个字典的结构和 Java 中的 HashMap 一样,是一维数组 + 二维链表结构,如下图,第一维数组的大小总是 2^n(n>=...0) ,扩容一 次数组大小空间加倍,也就是 n++ scan 指令返回的游标就是第一维数组的位置索引,我们将这个位置索引称为槽 (slot) 。...但是最终它们都会遍历所有的槽位并且没有重复 字典扩容 Java 中的 HashMap 有扩容的概念,当 loadFactor 达到阈值时,需要重新分配一个新的2 倍大小的数组,然后将所有的元素全部 rehash...rehash 就是将元素的hash 值对数组长度进行取模运算,因为长度变了,所以每个元素挂接的槽位可能也发生了变 化。...scan也需要考虑这个问题,对与 rehash 中的字典,它需要同时扫描新旧槽位,然后将结果融合后返回给客户端。

    54620

    Redis 数据结构-字典源码分析

    ,上述的定义代码是在 dict.h 文件中,该文件中,除了上述代码外,还有一些其他的API定义,如迭代器等。...//如果 key 已经存在于哈希表,那么返回 -1 //如果字典正在进行 rehash ,那么总是返回 1 号哈希表的索引。因为在字典进行 rehash 时,新节点总是插入到 1 号哈希表。...; // 以下两个条件之一为真时,对字典进行扩展 // 1)字典已使用节点数和字典大小之间的比率接近 1:1 并且 dict_can_resize 为真 // 2)已使用节点数和字典大小之间的比率超过...而在 Redis 的字典扩展或缩小的过程中,是一个渐进式的过程,为什么不是一次性进行操作,而是渐进式的方式?...因为如果字典较大,在扩展的时候,需要重新申请空间,再把旧字典的值 copy 到新的字典中取,这是一个 O(n) 的操作,很费时,所有,采用的是渐进式的方式,在字典进行扩展的过程中,还可以进行其他的操作,

    77440

    Python指南:组合数据类型

    ,带一个frozenset参数时,将返回改参数的 浅拷贝,对于任何其他类型的参数,都尝试将给定的对象转换为一个forzenset。...4、组合数据类型的迭代与复制 4.1 迭代子、迭代操作与函数 iterable数据类型每次返回其中的一个数据项。...,迭代子取值范围从start到stop-1,每两个值之间间隔step reversed(i) 返回一个迭代子,该迭代子以反序从迭代子i中的返回项 sorted(i, key, reverse) 以排序后顺序从迭代子...zip(i1, …, iN) 返回元组的迭代子,使用迭代子i1到iN 数据项返回的顺序依赖于底层的iterable。...对列表和元组等情况,数据项的返回值通常从第一个数据项开始依次返回,而对于字典与集合,迭代子是任意顺序的返回项。

    2.8K10

    清北NOIP训练营集训笔记——图论(提高组精英班)

    ]={0},cc=0; int dis[N];//最短路长度 int queue[N],top,tail;//双向队列queue,队头,队尾 bool in[N];//记录这个点在不在队列中,1表示在,...算法描述: 1.初始化:将除源点外的所有顶点的最短距离估计值 d[all]=+∞, d[start]=0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离...如果存在未收敛的顶点,则算法返回false,表明问题无解;否则算法返回true,并且从源点可达的顶点v的最短距离保存在 d[v]中。...; const int M=200500; int point[N]={0},to[M]={0},next[M]={0},cc=0; int xu[N]={0};//栈,初始值为空,xu[0]表示栈的大小...欧拉回路:在欧拉路径的基础上回到起点的路径(从起点出发一笔画遍历每一条边)。 欧拉路径存在: 无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。

    79510

    因为不会Redis的scan命令,我被开除了

    0x01 迭代过程中,进行过rehash 但是字典的大小是能够进行自动扩容的,我们不得不考虑以下两个问题: 第一,假如字典扩容了,变成2倍的长度,这种情况下,能够保证一定能遍历所有最初的key,但是却会出现大量重复...0x10 迭代过程中,正在进行rehash 上面考虑的情况是,在迭代过程的间隙中,rehash已经完成。那么会不会出现迭代进行中,切换游标时,rehash也正在进行?当然可能会发生。...让我们设想这么一个情况,字典的大小本身为4,开始迭代,当游标刚迭代完slot0时,返回的下一个游标时slot2,此时发现字典的大小已经从4rehash到8,那么不妨继续从size为8的hashtable...迭代过程中,进行过rehash这种情况下的迭代已经比较完美地解决了,那么迭代过程中,正在进行rehash的情况是如何解决的呢?...(因为较大字典的大小是较小字典的两倍,较大字典大小的最高位一定是1) 到此为止,我们已经将scan的核心源码通读一遍了,相信很多其间的迷惑也随之解开。

    1.4K20

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券