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中shape计算矩阵的方法示例
Apr 21 Python
Python 闭包的使用方法
Sep 07 Python
Python设计模式之代理模式简单示例
Jan 09 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
Python日志模块logging基本用法分析
Aug 23 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
python 使用shutil复制图片的例子
Dec 13 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
django 模型字段设置默认值代码
Jul 15 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
JSON Web Tokens的实现原理
2017/04/02 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
如何利用python查找电脑文件
2018/04/27 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
python 5个实用的技巧
2020/09/27 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
九不准学习心得体会
2016/01/23 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
一文弄懂MySQL索引创建原则
2022/02/28 MySQL