Python 多维List创建的问题小结


Posted in Python onJanuary 18, 2019

背景

最近在学Python,我觉得学习一个新语言最好的方式就是写一个简单的项目,所以就打算写一个简单的俄罗斯方块游戏。那么在写的过程中遇到了一个小问题。

def __init__(self, width = 10, height = 30):
  self.width, self.height = width, height
  self.board_size = [width, height]

我用一个二维List来记录游戏空间的状态,game_boardx代表一个格子,0代表这格子是空的,1代表不是。很显然,初始化的时候应该将所有的格子都赋值为0。查询了一下List的相关文档,发现可以用[0] * n这样的方式来快速创建特定长度的List,因此很自然的写出了下面这行代码。

self.game_board = [[0] * height] * width

查看一下结果,确实创建了长宽符合预期、值全部都是0的一个二维List,感觉没什么问题,就接着往下写了。

问题

但这两天在写消除方法的时候,使用最下面3排全是1,第四排中间是1其他全是0,这样消除完成之后应该还剩1个1掉落到第一排。但测试过程中发现无论如何都会导致所有的1都被消除了,一开始我还以为是消除的算法有问题,但后来在每一步过程中都监控整个game_board的状态时才发现,当一横排有一个值为1的时候,这一横排所有值都自动变成1了。

解决

很自然的就想到,这是由于List对象的引用产生的。[0] * height产生了长度为height并且内容全是0的List,由于0是个int,是基础数据类型,因此这样使用是正确的。但用这个List去进行* width操作时,产生的都是这个List的引用,而不是新建了width个List,所以修改其中任意一个就全部都修改了。

经过查阅Python文档,将代码修改为:

self.game_board = [([0] * height) for i in range(width)]

测试发现问题解决。

创建二维数组的办法

直接创建法

test = [0, 0, 0], [0, 0, 0], [0, 0, 0]]

简单粗暴,不过太麻烦,一般不用。

列表生成式法

test = [[0 for i in range(m)] for j in range(n)]

学会使用列表生成式,终生受益。

使用模块numpy创建

import numpy as np
test = np.zeros((m, n), dtype=np.int)

总结

其实是很基础的问题,对于Python *这个运算符不够了解,因此想当然觉得代表了对对象进行深拷贝。而且可能前端做多了,对数据结构这种基础不太敏感了吧,还是要多做练习啊。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python记录详细调用堆栈日志的方法
May 05 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
Python内置random模块生成随机数的方法
May 31 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
python给list排序的简单方法
Dec 10 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
python中mongodb包操作数据库
Apr 19 Python
python感知机实现代码
Jan 18 #Python
python实现感知器算法(批处理)
Jan 18 #Python
python实现多层感知器
Jan 18 #Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 #Python
基于python实现KNN分类算法
Apr 23 #Python
python实现定时发送qq消息
Jan 18 #Python
如何在Django中设置定时任务的方法示例
Jan 18 #Python
You might like
PHP操作xml代码
2010/06/17 PHP
php短址转换实现方法
2015/02/25 PHP
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
Python学习笔记(二)基础语法
2014/06/06 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
使用HTML5 Canvas API控制字体的显示与渲染的方法
2016/03/24 HTML / CSS
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
美国羊皮公司:Overland
2018/01/15 全球购物
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
师范应届生求职信
2013/11/15 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
运动会主持词大全
2015/07/02 职场文书
技术转让协议书
2016/03/19 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python