python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m

这篇具有很好参考价值的文章主要介绍了python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python生成矩阵,使用[[0]*n]*m,我们会发现,当改变其中某一个元素时,整列数据都会发生改变,而使用[[0 for i in range(n)] for j in range(m)]才可以生成正常的矩阵。

这是因为,list是可变元素,而int是不可变元素,对于list存储采用指针,引用型变量,改变矩阵其中某一个元素值,导致所有行的这个位置的元素都会改变。下面具体分析:

1、python列表的存储形式

python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m

Python列表和C语言数组不同,并不是存的实在的值,而是存放的只想其他实例的指针。所以也就能够理解 为什么python列表里里面什么东西都可以放进去而不需要考虑类型了~

2、 [0] * 2的存储形式

python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m

这里的 0 是同一个实例,可以通过以下代码发现这点~
(id表示查看实例的唯一标识符~)
python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m

3、 [[0]*2]*2的存储形式

python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m

下面两个箭头代表着下面的两行其实就是指向第一行两个指针,所以这里更改任意一行,都会对其他行产生影响,如图:

python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m
这里明明只更改了第三行的第三个元素,但是所有行的第三个元素都发生了变化,所以这也说明了指针这一特性,[[0]2]2所产生的其他行都 只是简单的指向第一行,不是进行复制 **,所以更改任意一行,其他行都会产生变化!

4、 [[0 for i in range(3)] for j in range(3)]

虽然里面所有的0 都是一个实例,但是进行修改时,修改的是不同的列表,如图:
python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m
(这里的lst就是用上面的 [[0]*3]*3来产生的,而another是由列表解析式产生的),可以看出,lst每一行的id都是一样的,而another是不一样的,即代表着不同的行,修改其中一行并不会对另外的行产生影响。

也有小伙伴会问了,那列表解析式里面每个元素都是同一个,修改其中一个难道不会对其他有影响吗,这里我贴出一下代码,朋友们可以自行测试一下。

aa = [0 for i in range(3)]          # 不可变类型
for i in aa: print(id(i))

aa = [[0] for i in range(3)]        # 可变类型
for i in aa: print(id(i))

aa = ['1' for i in range(3)]        # 不可变类型
for i in aa: print(id(i))

aa = [(1,2) for i in range(3)]      # 不可变类型
for i in aa: print(id(i))

不可变类型修改的时候是创建一个全新的实例,如果每个id都不一样的话,会非常耗费内存,而且一般不会对其他东西有影响,所以就创建相同的实例,但是可变类型不能这样,可变类型如果id相同,那么修改他们的元素会对其他实例产生影响,所以每个实例都应该是一个全新的实例

归根结底,还是我这里第一条所概述的,Python的列表存储方式是用的指针指向实例地址来存储的,列表里面放的就是指针的地址。

所以,君不见python里面没有指针,但是指针始终如影随形。😁文章来源地址https://www.toymoban.com/news/detail-416426.html

到了这里,关于python生成矩阵为何[[0 for i in range(n)] for j in range(m)]而不能[[0]*n]*m的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入探究for...range语句

    在Go语言中,我们经常需要对数据集合进行遍历操作。对于数组来说,使用for语句可以很方便地完成遍历。然而,当我们面对其他数据类型,如map、string 和 channel 时,使用普通的for循环无法直接完成遍历。为了更加便捷地遍历这些数据类型,Go语言引入了for...range语句。本文将

    2024年02月08日
    浏览(49)
  • Go for Range遍历

     遍历slice的时候会先获取slice的长度作为循环次数,在遍历过程中添加的元素不会被遍历到,map插入数据的位置是随机的,所以遍历过程中新插入的数据不能保证遍历到。 在forrange的过程中,数据会进行一次拷贝,我们如果直接对拷贝的数据进行操作是无法改变原来的数据的

    2024年02月13日
    浏览(38)
  • Ant Design Vue a-range-picker 限制用户不能选择今天之后的日期

       a-range-picker                 v-model:value=\\\"formState.timeOfPurchase\\\"                 :disabled-date=\\\"disabledDate\\\"                 :allowClear=\\\"false\\\"                 class=\\\"w-[300px]\\\"                 size=\\\"large\\\"                 format=\\\"YYYY-MM-DD\\\" /   const disabledDate = (current: dayjs) = {     i

    2024年01月16日
    浏览(37)
  • for-range排坑指南

    如下代码想从数组遍历获取一个指针元素切片集合 答案是【取不到】 同样代码对切片 []int{1, 2} 或 map[int]int{1:1, 2:2} 遍历也不符合预期。 问题出在哪里? 通过查看go编译源码可以了解到, for-range其实是语法糖,内部调用还是for循环,初始化会拷贝带遍历的列表(如array,slice,

    2024年02月08日
    浏览(91)
  • 成为数字游民,他们为何「All in Web3」?

    成为数字游民,他们为何「All in Web3」? “早上好,夜之城。” 赛博朋克承载着一代人对未来世界的遐想。今年上映的「赛博朋克:边缘行者」中,主人公大卫面临着不夜城旧有制度的高压和控制,对旧有秩序不断发起冲击,“总有一天你会站上荒坂塔的顶端” 成为他前行

    2024年02月02日
    浏览(41)
  • IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)错误解决办法

    在使用pytorch交叉熵损失函数loss = nn.CrossEntropyLos(v, targets)时发现报错 IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)。 排查后发现模型预测值V在训练阶段最后一个step时,tensor维度从二维变成一维,导致出错。 例:训练集个数81,bs设置为4时,最后一个step 只剩

    2024年02月10日
    浏览(47)
  • go中for range的坑以及解决方案

    相信小伙伴都遇到过以下的循环变量的问题,那是因为循环的val变量是重复使用的,即仅有一份。也就是说,每次循环后赋给val的值就会把前面循环赋给val的值替换掉,所以打印出来的值都是最后一次循环赋给val的值。 使用局部变量/临时变量,即可解决         可以设置

    2024年01月25日
    浏览(39)
  • Deep Learning for Natural Language Processing in Python

    作者:禅与计算机程序设计艺术 在这篇文章中,我将会介绍一下基于深度学习的自然语言处理(NLP)模型的相关知识、术语及其核心算法原理和具体操作步骤。首先,我将会简要介绍一下什么是NLP、为什么需要NLP、NLP所涉及到的领域等相关背景知识。随后,我会对一些基本概

    2024年02月07日
    浏览(51)
  • Golang中for和for range语句的使用技巧、对比及常见的避坑

    2024.1.0更新: Go 团队将修改 for 循环变量的语义,Go1.21 新版本即可体验! 今天看见了这篇文章,Go的1.22版本将更新,大致理解未会默认进行 v:=v 这个操作,因此此文所概述的许多坑,在1.22之后都可能会更新。 2024.2就会发布新版本,到时候再测试一下看看情况。 基础语法不

    2024年02月01日
    浏览(62)
  • 解决UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position xxx: ordinal not in range

    在调用一个库时,出现了一个异常报错类似如UnicodeEncodeError: \\\'ascii\\\' codec can\\\'t encode characters in position 0-1: ordinal not in range(128),只要该库返回结果包含中文,该结果时就会出现该异常。 原因: Python2默认使用ASCII编码,ASCII编码不包含中文,处理中文时会报错 Python3更换为默认使用

    2024年02月11日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包