【问题标题】:Python matrix shared values of rowsPython矩阵共享行的值
【发布时间】:2019-04-25 04:02:41
【问题描述】:

所以我有一个创建矩阵的问题,但我不确定为什么要共享这些值?不确定是不是因为序列是引用类型?

如果你在 pythontutor 中编写这段代码,你会发现主元组都指向同一个“行”元组并且是共享的。我知道如果我做了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)

【问题讨论】:

  • 这就是语言的工作方式:[hex(id(x)) for x in (0,) * 3] #=> ['0x5fb0d1c0', '0x5fb0d1c0', '0x5fb0d1c0']。你可以看到任何相乘的东西仍然是一个参考。

标签: python matrix shared


【解决方案1】:

当你乘以一个元组时,你实际上并没有乘以它的内容。您正在创建对其内存地址的引用。因此,如果您编辑原始变量的内容,所有共享其内存地址的变量也会被更改。

【讨论】:

  • 是的,我实际上要问的是为什么连接元组和附加列表会创建对这个内存地址的相同引用
【解决方案2】:

在第一个示例中,您创建了一次元组并将其多次添加到矩阵中:

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,)

所以当同一个元组被多次追加时,你会多次“共享”它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2016-11-12
    • 2021-05-31
    相关资源
    最近更新 更多