page contents

连夜整理了十个 Python 新手最常踩的赋值坑,尤其第七个,我当年调了一整天

我当老师这些年,看到最多的问题就是赋值。新手觉得赋值很简单,不就是等号嘛。可偏偏就是等号,能让人调一整天。我当年就踩过这个坑,第七个坑让我对着屏幕发呆到凌晨三点。

attachments-2026-09-1416Q2ou6a98cf49ac6cd.png我当老师这些年,看到最多的问题就是赋值。新手觉得赋值很简单,不就是等号嘛。可偏偏就是等号,能让人调一整天。我当年就踩过这个坑,第七个坑让我对着屏幕发呆到凌晨三点。

第一个坑,直接用一个变量名覆盖了内置函数。不少同学写代码,突然需要个列表,就顺手写了个 list = [1,2,3]。结果后面用 list() 转换其他数据,程序直接报错。你把 list 这个函数名给占用了,它当然没法正常工作。改个名字就好,比如 mylist。

第二个坑,链式赋值搞混了对象。有人写 a = b = [ ],看着挺方便。后来 b.append(1),以为 a 还是空列表。结果 a 也变成了 [1]。链式赋值让两个变量指向同一个列表对象,不是创建了两个独立列表。

第三个坑,用可变对象当默认参数。写函数的时候,参数默认值设为空列表。第一次调用没事,第二次调用就发现列表里还留着上次的数据。因为默认参数在函数定义时就创建了,每次调用用的是同一个对象。我让学生改成 None,在函数内部创建新列表。

第四个坑,切片赋值和重新赋值分不清。有的同学写 a = b[:] 以为就是复制了b。结果 a[0] = 10,b 也跟着变了。不对,a = b[:] 其实创建了新列表,新列表和旧列表没有关系。真正的问题是有人写 a[0] = 10,觉得 b 不会受影响,实际上 b 确实不受影响。

第五个坑,多重赋值顺序搞反了。想交换两个变量,写成 a, b = b, a。这个写法没错。错的是有人写 a = b, b = a。这样就丢失了 a 原来的值。Python 的元组交换是个好特性,但一定要用对格式。

第六个坑,循环里修改正在遍历的列表。比如想删除列表里所有负数,就写 for i in list: if i < 0: list.remove(i)。结果发现有些负数没删掉。因为 remove 改变了列表长度和索引,循环就跳过了某些元素。我让学生用列表推导式创建新列表。

第七个坑,就是 numpy 数组的赋值问题。当年我做数据分析,写了个 a = b,然后改了 a 的值。b 也变了。我以为 b 是 a 的副本。实际上 numpy 数组的赋值只是创建了视图,没有复制数据。要用 a = b.copy() 才行。那个晚上我查遍了所有代码,就是没发现这个细节。

第八个坑,类属性赋值和实例属性赋值不一样。在类里定义了一个属性,然后通过实例对象修改它。结果其他实例对象也跟着变了。因为改的是类属性,不是实例属性。正确做法是在 __init__ 方法里定义实例属性。类属性和实例属性是两个东西,不能混用。

第九个坑,关于 is 和 == 的比较。写 a is b,以为判断的是值相等。实际上 is 比较的是内存地址。赋值操作后两个变量名可能指向同一个对象,也可能指向不同对象。简单数字和字符串有缓存机制,复杂对象没有。所以判断值相等一定用 ==。

第十个坑,在条件语句里赋值。有人写 if x = 10:,本意是判断 x 是否等于10。结果变成了赋值。Python 不允许在条件语句里直接赋值,但有人会在循环里写 while data = get_data():,这虽然能用,但容易混淆。不如拆开写,清晰明确。

这些坑每个我都亲眼见过。学生调试时急得满头大汗,我就让他们从赋值开始检查。很多时候问题不在算法复杂,就在最基础的操作上。赋值这个动作,在 Python 里有自己的规则。花时间搞明白,能省下以后无数的调试时间。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2372 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 2372 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章