python中可在原处修改列表的是_python – 尝试在一个位置更改时,列表中的多个位置的值更改...

关于乘法运算符*如何在python中的列表上工作,有一些细微之处.

更一般地说,当应用于不可变对象(如整数或字符串)时,它的效果会有所不同,以及它们在应用于列表和字典等可变对象时的效果.

这可能会澄清问题:

>>> l = [0] * 3 #a list of immutable integers

>>> l

[0, 0, 0]

>>> l[0] = 1

>>> l

[1, 0, 0]

>>> l = [[0]] * 3 #a list of mutable lists

>>> l

[[0], [0], [0]]

>>> l[0][0] = 1

>>> l

[[1], [1], [1]]

EDIT(评论中对@lazyr的称赞)在两种情况下,*运算符都会创建一个具有相同标识(内存地址)的对象列表,因此数组中的每个数字(和每个列表)都是同一个对象但是,不可变类型不能被修改但只能被替换,因此当您尝试为整数数组分配新值时,您将事实上替换整个对象,而列表不是这种情况.上一个示例中的Bulding(请记住,id函数返回对象的内存地址):

>>> m = [1] * 3

>>> id(m[0])

39356344

>>> id(m[1])

39356344

>>> m[1] = 2

>>> id(m[1])

39356320 # new memory addres = different object!

>>> m = [[1]] * 3

>>> id(m[0])

40275408

>>> id(m[1])

40275408

>>> m[1][0] = 2

>>> id(m[1])

40275408 # same memory address = still the same object!

因此,在您的情况下,可能的解决方法是初始化矩阵,如下所示:

>>> matrix = [[0 for i in range(3)] for j in range(2)]

>>> matrix

[[0, 0, 0], [0, 0, 0]]

>>> matrix[0][2] = 1

>>> matrix

[[0, 1, 0], [0, 0, 0]]

另一种 – 更激进的方式 – 将完全转向numpy,这种方法更快,并且从根本上考虑了极快的矩阵和多维向量操作,但它也更难使用.

HTH!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值