两种python 2d数组初始化方法之间的差异

两种python 2d数组初始化方法之间的差异,python,python-3.x,Python,Python 3.x,使用创建的两个数组之间有什么区别 array1 = [[0] * 2] * 3 及 我这样问是因为它们显示不同的行为(例如,当我在数组1中增加一个整数时,它将增加该列中的每个值)。检查以下内容: 基本上,当您将一个列表(正如评论员所指出的,它们在技术上是Python中的列表,而不是数组)乘以一个整数时,Python将多次插入相同的引用。也就是说,当运行[0]*2时,它不会创建额外的零,而是插入对该第一个零的额外引用 第二个版本每次循环时都会创建数字/列表的附加实例,这就是为什么(即使对列表内容

使用创建的两个数组之间有什么区别

array1 = [[0] * 2] * 3

我这样问是因为它们显示不同的行为(例如,当我在数组1中增加一个整数时,它将增加该列中的每个值)。

检查以下内容:

基本上,当您将一个列表(正如评论员所指出的,它们在技术上是Python中的列表,而不是数组)乘以一个整数时,Python将多次插入相同的引用。也就是说,当运行
[0]*2
时,它不会创建额外的零,而是插入对该第一个零的额外引用

第二个版本每次循环时都会创建数字/列表的附加实例,这就是为什么(即使对列表内容求值的是同一个表达式)引用是独立的

希望这有帮助

看看这个:

基本上,当您将一个列表(正如评论员所指出的,它们在技术上是Python中的列表,而不是数组)乘以一个整数时,Python将多次插入相同的引用。也就是说,当运行
[0]*2
时,它不会创建额外的零,而是插入对该第一个零的额外引用

第二个版本每次循环时都会创建数字/列表的附加实例,这就是为什么(即使对列表内容求值的是同一个表达式)引用是独立的


希望这有帮助

array1
正在创建单个列表的引用列表,而
array2
正在按值构建新列表
array1=[[0]*2]*3
的意思是“将三个指针指向同一个列表(在我们的例子中,
[0,0]
),并用它们填充一个新列表。”因此,实际上,同一个列表在三个不同的索引中表示,因此,如果更改
array1
的任何索引,所有三个值都将更改,因为它们都是同一个列表


同时,
array2=[[0 for uuu.in range(2)]for u.in range(3)]
正在生成三个不同的列表,所有这些列表都具有相同的值,在我们的例子中,
[0,0]
array1
正在生成单个列表的引用列表,而
array2
正在按值构建新的列表
array1=[[0]*2]*3
的意思是“将三个指针指向同一个列表(在我们的例子中,
[0,0]
),并用它们填充一个新列表。”因此,实际上,同一个列表在三个不同的索引中表示,因此,如果更改
array1
的任何索引,所有三个值都将更改,因为它们都是同一个列表


同时,
array2=[[0表示范围内(2)]表示范围内(3)]
正在生成三个不同的列表,所有列表都具有相同的值,在我们的例子中,
[0,0]

注意,在Python术语中,这些是“列表”而不是“数组”。注意,在Python术语中,这些是“列表”而不是“数组”。
array2
根本不进行“复制”。它正在制作几个新的数组,这些数组恰好包含相同的数据。@shadowtalker我可以看出这种语言可能会产生误导。我实际上是在引用python的按引用与按值差异。由于所有变量都是指针,它们都指向同一个对象实例,直到强制唯一为止。请避免通过指针模糊地描述Python。这个术语令人难以置信地超载,对不同背景的人来说可能会产生误导。Python语言没有指针的概念,也没有不同的引用和值类型
[0]*2
是一个对象,
[[0]*2]*3
三次包含同一个对象。
array2
根本不进行“复制”。它正在制作几个新的数组,这些数组恰好包含相同的数据。@shadowtalker我可以看出这种语言可能会产生误导。我实际上是在引用python的按引用与按值差异。由于所有变量都是指针,它们都指向同一个对象实例,直到强制唯一为止。请避免通过指针模糊地描述Python。这个术语令人难以置信地超载,对不同背景的人来说可能会产生误导。Python语言没有指针的概念,也没有不同的引用和值类型
[0]*2
是一个对象,而
[[0]*2]*3
三次包含同一个对象。
[0]*2
创建了我所知的其他实例(而不是引用)。
[0]*2
创建了我所知的其他实例(而不是引用)
array2 = [[0 for _ in range(2)] for _ in range(3)]