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封装shell命令实例分析
May 05 Python
python去掉行尾的换行符方法
Jan 04 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
用Python写一段用户登录的程序代码
Apr 22 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
Pycharm小白级简单使用教程
Jan 08 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
Python连接Impala实现步骤解析
Aug 04 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
提取视频中的音频 Python只需要三行代码!
May 10 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入门学习笔记之一
2010/10/12 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
js闭包实例汇总
2014/11/09 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
python文件排序的方法总结
2020/09/13 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
简单而又朴实的个人求职信分享
2013/12/12 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
公司员工辞职信范文
2015/05/12 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
html form表单基础入门案例讲解
2021/07/21 HTML / CSS