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使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python随机生成彩票号码的方法
Mar 05 Python
在Python中调用ggplot的三种方法
Apr 08 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
Python 实现域名解析为ip的方法
Feb 14 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
python异步编程 使用yield from过程解析
Sep 25 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 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/03/22 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
jQuery 行级解析读取XML文件(附源码)
2009/10/12 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
简述vue中的config配置
2018/01/23 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
Python中列表(list)操作方法汇总
2014/08/18 Python
详解Django中Request对象的相关用法
2015/07/17 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
Django学习之文件上传与下载
2019/10/06 Python
Python如何将模块打包并发布
2020/08/30 Python
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
食品采购员岗位职责
2014/04/14 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
银行转正自我鉴定
2014/09/29 职场文书
2014年班干部工作总结
2014/11/25 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android