社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

为什么python在分配matrix元素时会根据构建矩阵的方式做出不同的反应?[复制品]

Yassine Jiyar • 5 年前 • 2021 次点击  

我创建了一个列表列表并希望将项目附加到单个列表,但是当我尝试附加到其中一个列表时( a[0].append(2) ,该项将添加到所有列表中。

a = []
b = [1]

a.append(b)
a.append(b)

a[0].append(2)
a[1].append(3)
print(a)

给予: [[1, 2, 3], [1, 2, 3]]

但我希望: [[1, 2], [1, 3]]

改变我构建列表初始列表的方式,使 b 一个浮点数而不是一个列表并将括号放在里面 .append() ,提供所需的输出:

a = []
b = 1

a.append([b])
a.append([b])

a[0].append(2)
a[1].append(3)
print(a)

给予: [[1,2],[1,3]]

但是为什么呢?结果应该不同,这不是直觉。我知道这和 multiple references to the same list ,但我不知道发生在哪里。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43697
 
2021 次点击  
文章 [ 3 ]  |  最新文章 5 年前
msw
Reply   •   1 楼
msw    14 年前

为了简单地复制一个列表,这个成语是

a.append(b[:])

如果翻倍的话,A就会有两份新的名单 b 它不会给你报告的别名错误。

Gavin H
Reply   •   2 楼
Gavin H    14 年前

关键是这一部分:

a.append(b)
a.append(b)

你将同一个列表追加两次,所以 a[0] a[1] 是对同一列表的引用。

在第二个示例中,每次调用append like时都会创建新列表 a.append([b]) ,因此它们是用相同的浮点值初始化的独立对象。

Bryan Oakley
Reply   •   3 楼
Bryan Oakley    10 年前

这是因为列表包含对对象的引用。您的列表不包含 [[1 2 3] [1 2 3]] 它是 [<reference to b> <reference to b>] .

当您更改对象时(通过在 b ),您正在更改对象本身,而不是包含该对象的列表。

为了得到你想要的效果,你的清单 a 必须包含 而不是提及 . 若要复制列表,可以使用范围 [:] . 例如:

>>> a=[]
>>> b=[1]
>>> a.append(b[:])
>>> a.append(b[:])
>>> a[0].append(2)
>>> a[1].append(3)
>>> print a
[[1, 2], [1, 3]]