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爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
Python实现网站文件的全备份和差异备份
Nov 30 Python
python获取文件扩展名的方法
Jul 06 Python
Python实现复杂对象转JSON的方法示例
Jun 22 Python
简单谈谈Python的pycurl模块
Apr 07 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
详解Python的三种拷贝方式
Feb 11 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
python缩进长度是否统一
Aug 02 Python
python爬取某网站原图作为壁纸
Jun 02 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使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
python多行字符串拼接使用小括号的方法
2020/03/19 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
Python os模块常用方法和属性总结
2020/02/20 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
寒假思想汇报
2014/01/10 职场文书
社区母亲节活动方案
2014/03/05 职场文书
安全保证书范文
2014/04/29 职场文书
微笑服务演讲稿
2014/05/13 职场文书
农村门前三包责任书
2014/07/25 职场文书
创业计划书之美甲店
2019/09/20 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
nginx 配置指令之location使用详解
2022/05/25 Servers
python实现双向链表原理
2022/05/25 Python