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 调用VC++的动态链接库(DLL)
Sep 06 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
从Python程序中访问Java类的简单示例
Apr 20 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
PyQt5图形界面播放音乐的实例
Jun 17 Python
Python函数中的可变长参数详解
Sep 12 Python
Python实现名片管理系统
Feb 14 Python
python os模块在系统管理中的应用
Jun 22 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 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
php强制下载文件函数
2016/08/24 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
js获取url传值的方法
2015/12/18 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
python生成特定分布数的实例
2019/12/05 Python
python中pow函数用法及功能说明
2020/12/04 Python
学校综治宣传月活动总结
2014/07/02 职场文书
活动总结报告怎么写
2014/07/03 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
Javascript设计模式之原型模式详细
2021/10/05 Javascript
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL