所以我有一个问题要创建一个矩阵,但我不确定为什么这些值是共享的?不确定它是否由于序列是引用类型?
如果你在pythontutor中编写这段代码,你会发现主元组都指向同一个'row'元组并且是共享的。我明白,如果我做return row*n
它会被共享,但为什么当你连接元组或附加列表时,为什么它会被共享(引用相同的内存地址)?
def make_matrix(n):
row = (0, )*n
board = ()
for i in range(n):
board += (row,)
return board
matrix = make_board(4)
print(matrix)
与此代码相比,每行分别(0,0,0,0)并且不共享。
def make_board(n):
return tuple(tuple(0 for i in range(n)) for i in range(n))
matrix = make_board(4)
print(matrix)
当你乘以一个元组时,你实际上并没有将它的内容相乘。您正在创建对其内存地址的引用。因此,如果编辑原始变量的内容,则共享其内存地址的所有变量也会更改。
在第一个示例中,您创建了一个元组,并将其多次添加到矩阵中:
row = (0, )*n
for i in range(n):
board += (row,)
在第二个示例中,您将为每个添加创建新元组:
tuple(0 for i in range(n)) for i in range(n)
这相当于:
for i in range(n):
row = tuple(0 for i in range(n))
board += (row,)
因此,当多次追加相同的元组时,您会多次“共享”它。