Python 多维List创建的问题小结

 更新时间:2019年01月18日 14:39:22   作者:hcfw007  
这篇文章主要介绍了Python 多维List创建的问题小结,详细的介绍了遇到的一个小问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

背景

最近在学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自带PIL库扩展图片大小给图片加文字描述的方法示例

    利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例

    最近的一个工程项目是讲文字添加到图像上,所以下面这篇文章主要给大家介绍了关于利用Python自带PIL库扩展图片大小给图片加文字描述的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • python cv2图像质量压缩的算法示例

    python cv2图像质量压缩的算法示例

    使用opencv对图像进行编码,一方面是图像二进制传输的需要,另一方面对图像压缩。本文主要介绍了python cv2图像质量压缩的算法示例,感兴趣的可以了解一下
    2021-06-06
  • Python 自制简单版《我的世界》的详细过程

    Python 自制简单版《我的世界》的详细过程

    这篇文章主要介绍了教你用 Python 自制简单版《我的世界》,接下来,我们就带你运行这个项目,并对这个开源的小游戏做一下简单的更改,让它变成“你的”世界
    2021-11-11
  • pytorch masked_fill报错的解决

    pytorch masked_fill报错的解决

    今天小编就为大家分享一篇pytorch masked_fill报错的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 在Python的Django框架中编写错误提示页面

    在Python的Django框架中编写错误提示页面

    这篇文章主要介绍了在Python的Django框架中编写错误提示页面,包括传统的404页面和设置连接中断警告等,需要的朋友可以参考下
    2015-07-07
  • python3模块smtplib实现发送邮件功能

    python3模块smtplib实现发送邮件功能

    这篇文章主要为大家详细介绍了python3模块smtplib实现发送邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • python 如何获取元素在array中的下标

    python 如何获取元素在array中的下标

    这篇文章主要介绍了python 获取元素在array中的下标操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 用Python判断奇偶数示例

    用Python判断奇偶数示例

    大家好,本篇文章主要讲的是用Python判断奇偶数示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • python3处理含有中文的url方法

    python3处理含有中文的url方法

    今天小编就为大家分享一篇python3处理含有中文的url方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 基于Python创建语音识别控制系统

    基于Python创建语音识别控制系统

    这篇文章主要介绍了通过Python实现创建语音识别控制系统,能利用语音识别识别说出来的文字,根据文字的内容来控制图形移动,感兴趣的同学可以关注一下
    2021-12-12

最新评论