听说面试官比较喜欢这些坑。
函数默认参数可变

默认参数有个最大的坑,演示如下:
先定义一个函数,传入一个 list,添加一个END再返回:

def add_end(L=[]):L.append('END')return L

当你正常调用时,结果似乎不错:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

当你使用默认参数调用时,一开始结果也是对的:

>>> add_end()
['END']

但是,再次调用add_end()时,结果就不对了:

>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

很多初学者很疑惑,默认参数是[],但是函数似乎每次都“记住了”上次添加了’END’后的 list。

原因解释如下:

Python 函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

定义默认参数要牢记一点:默认参数必须指向不变对象!

要修改上面的例子,我们可以用None这个不变对象来实现:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def add_end(L=None):if L is None:L = []L.append('END')return L

现在,无论调用多少次,都不会有问题:

>>> add_end()
['END']
>>> add_end()
['END']

序列中存储同一个可变对象的多个引用

如果想要把一个序列复制几份然后再拼接起来,可以把这个序列乘一个整数,这个操作会产生一个新序列:


>>> l = [1, 2, 3]
>>> l * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

如果在a n这个语句中,序列 a
里的元素是对其他可变对象的引用的话,你就需要格外注意了,因为这个式子的结果可能会出乎意料。

比如,你想用my_list = [[]]
3来初始化一个由列表组成的列表,但是你得到的列表里包含的 3 个元素其实是 3 个引用,而且这 3
个引用指向的都是同一个列表。这可能不是你想要的结果。
下面来看看如何初始化一个由列表组成的列表。`

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 示例:一个包含3个列表的列表,嵌套的3个列表各自有3个元素来代表井字游戏的一行方块
>>> board = [['_'] * 3 for i in range(3)]
>>> board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> board[1][2] = 'X'
>>> board
[['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]# 等价于下面这种写法
>>> board = []
>>> for i in range(3):
...     row = ['_'] * 3
...     board.append(row)
...
>>> board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> board[2][0] = 'X'
>>> board
[['_', '_', '_'], ['_', '_', '_'], ['X', '_', '_']]

下面展示了另一个方法,这个方法看上去是个诱人的捷径,但实际上它是错的。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> weird_board = [['_'] * 3] * 3
>>> weird_board
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
>>> weird_board[1][2] = 'O'
>>> weird_board
[['_', '_', 'O'], ['_', '_', 'O'], ['_', '_', 'O']]# 等价于下面这种写法
>>> row = ['_'] * 3
>>> board = []
>>> for i in range(3):
...     board.append(row)

含有 3 个指向同一对象的引用的列表是毫无用处的。
当我们不做修改的时候,看起来都还好。一旦我们试图标记第 1 行第 2 列的元素,就立马暴露了列表内的 3 个引用指向同一个对象的事实。

Python可变序列中的一些坑相关推荐

  1. python中的可变序列有哪些_Python可变序列中的一些坑,记得多注意

    听说面试官比较喜欢这些坑. 函数默认参数可变 默认参数有个最大的坑,演示如下: 先定义一个函数,传入一个 list,添加一个END再返回: def add_end(L=[]): L.append('E ...

  2. python可变序列_Python3基础(二)—— Python可变序列

    本文会集中讲Python3中的可变序列--列表. Python序列有3种基本序列类型(list.tuple.range).处理文本的序列类型(str).处理二进制数据的序列类型(bytes.bytea ...

  3. python可变序列和不可变序列_一文看懂可变序列和不可变序列

    先说点概念 在解释可变/不可变序列之前,先要知道什么是序列?序列就一个个元素有序地排列在一起,像小朋友"排排坐,吃果果"一样. 可变序列就是创建一个序列后,可以改变元素,可以比如成 ...

  4. python返回序列中的最小元素_python实现获取序列中最小的几个元素

    本文实例讲述了python实现获取序列中最小的几个元素.分享给大家供大家参考. 具体方法如下: import heapq import random def issorted(data): data ...

  5. Python从序列中选择k个不重复元素

    昨天的文章中有个错别字,开头第一句"颜色"应为"演示",抱歉抱歉. Python操作高版本Excel文件:颜色.边框.合并单元格 集合中的元素不允许重复,Pyt ...

  6. python可变序列_python序列中可变数据类型有什么

    python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住"一切皆为对象,一切皆为对象的引用"这句话,其实这个特点类似于JAVA,所以在pyth ...

  7. python调用imblearn中SMOTE踩坑

      SMOTE是用来解决样本种类不均衡,专门用来过采样化的一种方法.第一次接触,踩了一些坑,写这篇记录一下: 问题一:SMOTE包下载及调用 # 包下载 pip install imblearn# 调 ...

  8. Python计算序列中数字最大差值(美团2016校招笔试题)

    题目要求:给定一个包含若干数字的序列A(本文以列表为例),求满足0≤a≤b<n(其中n为序列长度)的A[b] - A[a]的最大值. 编程要点:循环结构用法,切片,内置函数enumerate() ...

  9. python不变的数据结构是_Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法...

    本文实例讲述了Python从序列中移除重复项且保持元素间顺序不变的方法.分享给大家供大家参考,具体如下: 问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可 ...

最新文章

  1. TFmini传感器使用
  2. 基于SharePoint大型企业协同门户产品-永久免费
  3. 自考总结-2019-4-14
  4. CTF web题总结--绕过正则表达式
  5. Boost:基于Boost的发送者和接收者的测试程序
  6. 币安Binance.client can‘t find the module client 解决办法
  7. .Net Core手撸一个基于Token的权限认证
  8. RPC——一切架构的基础
  9. javascript 调用C++函数
  10. MySQL使用小技巧(二)——MySQL忘记密码怎么办
  11. 2010.11.18 关于向窗口发送消息
  12. 继承ActionSupport例子展示
  13. d2008标定说明书_柯力D2008调试说明书.pdf
  14. Java widget xui_XUI使用总结
  15. VxWorks的漏洞分析与解决方案
  16. TreeMap排序是怎么样的?
  17. 谈谈 WiFi STBC
  18. MarkDown 标题居中
  19. 市场调研报告-全球与中国云产品生命周期管理(PLM)软件市场现状及未来发展趋势
  20. webpack 5高级配置优化

热门文章

  1. Android中隐藏光标
  2. java学习:理解abstract
  3. Ping Function
  4. 网管日志-06.07.12
  5. android listview item长按事件,ListView的点击事件,长按事件,数据刷新
  6. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
  7. python numpy 子数组_Python利用Numpy数组进行数据处理(一)
  8. 增强——BTE流程简介
  9. 哈士奇与阿拉斯加的区别!
  10. SAP财务报表不平之分析