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中的字典与成员运算符初步探究
Oct 13 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
Python科学计算之NumPy入门教程
Jan 15 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
Django中Model的使用方法教程
Mar 07 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
python如何通过pyqt5实现进度条
Jan 20 Python
python中def是做什么的
Jun 10 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 Python
Python实现老照片修复之上色小技巧
Oct 16 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
投票管理程序
2006/10/09 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
php session的应用详细介绍
2017/03/22 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
Python open()文件处理使用介绍
2014/11/30 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
Python中关于浮点数的冷知识
2019/09/22 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
django使用channels实现通信的示例
2020/10/19 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
停车位租赁协议书
2014/09/24 职场文书
2015年环卫工作总结
2015/04/28 职场文书
小学校园广播稿
2015/08/18 职场文书
2016年感恩节寄语
2015/12/07 职场文书
干部理论学习心得体会
2016/01/21 职场文书
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang