资讯专栏INFORMATION COLUMN

Python 多维List创建的问题

Nosee / 2073人阅读

摘要:查看一下结果,确实创建了长宽符合预期值全部都是的一个二维,感觉没什么问题,就接着往下写了。经过查阅文档,将代码修改为测试发现问题解决。

背景

最近在学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)]

测试发现问题解决。

总结

其实是很基础的问题,对于Python *这个运算符不够了解,因此想当然觉得代表了对对象进行深拷贝。而且可能前端做多了,对数据结构这种基础不太敏感了吧,还是要多做练习啊。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43041.html

相关文章

  • Python学习之路21-序列构成数组

    摘要:第行把具名元组以的形式返回。对序列使用和通常号两侧的序列由相同类型的数据所构成当然不同类型的也可以相加,返回一个新序列。从上面的结果可以看出,它虽抛出了异常,但仍完成了操作查看字节码并不难,而且它对我们了解代码背后的运行机制很有帮助。 《流畅的Python》笔记。接下来的三篇都是关于Python的数据结构,本篇主要是Python中的各序列类型 1. 内置序列类型概览 Python标准库...

    ralap 评论0 收藏0
  • [零基础学python]list和str比较

    摘要:和两种类型数据,有不少相似的地方,也有很大的区别。偏移量从开始,总元素数减结束。和转化这个内置函数实现的是将转化为。在看例子之前,请看官在交互模式下做如下操作得到了对这个内置函数的完整说明。 list和str两种类型数据,有不少相似的地方,也有很大的区别。本讲对她们做个简要比较,同时也是对前面有关两者的知识复习一下,所谓温故而知新。 相同点 都属于序列类型的数据 所谓序列类型的数...

    codergarden 评论0 收藏0
  • 数据科学(1):numpy基础

    摘要:现在到数据分析部分,先从开始环境基础是高性能科学计算和数据分析的基础包。花式索引花式索引指的是利用整型数组进行索引,它是将索引数组的元素的值作为目标数组的下标,来获取目标数组下标对应的值。 最近的爬虫学习告一段落,后续补上爬虫的笔记。现在到数据分析部分,先从NumPy开始(环境python-3.6.5) 2019/1/23 NumPy基础 NumPy是高性能科学计算和数据分析的基础包。...

    ISherry 评论0 收藏0
  • Numpy数组索引与切片和变形拼接分裂

    摘要:一一维数组的索引与切片对象的内容可以通过索引或切片来访问和修改,与中的切片操作一样。在指定位置分裂数组本身作为一个参数,分类位置构成的列表作为第二个参数同时也可以对一维数组和多位数组进行操作。 1.概述 今天我们来讲一下Numpy数组的索引与切片,numpy数组的索引与切片和Python中的切片与索引的作用相同,可以快速的取出数据,进行下一步的运用或者查看,但是两种切片还有一些不同的地...

    miracledan 评论0 收藏0

发表评论

0条评论

Nosee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<