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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Django视图之ORM数据库查询操作API的实例
Oct 27 Python
实用自动化运维Python脚本分享
Jun 04 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
python中树与树的表示知识点总结
Sep 14 Python
基于Django统计博客文章阅读量
Oct 29 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
使用python实现名片管理系统
Jun 18 Python
如何解决.cuda()加载用时很长的问题
May 24 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中用memcached实现页面防刷新功能
2014/08/19 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
jquery json 实例代码
2010/12/02 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
JSON相关知识汇总
2015/07/03 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
HTML5中使用postMessage实现两个网页间传递数据
2016/06/22 HTML / CSS
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
初中女生自我鉴定
2013/12/19 职场文书
青蓝工程实施方案
2014/03/27 职场文书
销售经理竞聘书
2014/03/31 职场文书
2014年环卫工作总结
2014/11/22 职场文书