1

リストのエイリアシングが Python の問題であることは知っていますが、それを回避する方法がわかりません。

def zeros(A):
    new_mat = A
    for i in range(len(A)):
        for j in range(len(A[i])):
            if A[i][j]==0:
                for b in range(len(A)):
                    new_mat[b][j] = 0
            else:
                new_mat[i][j] = A[i][j]
    return A

A の値をまったく変更していませんが、A を返すと、まだ変更されています。

>>> Matrix = [[1,2,3],[5,0,78],[7,3,45]]
>>> zeros(Matrix)
[[1, 0, 3], [5, 0, 78], [7, 0, 45]]

このリストはエイリアシングですか? もしそうなら、エイリアシングを起こさずに 2D 配列の要素をどのように変更しますか? どうもありがとう<3。

4

4 に答える 4

3

new_mat = A新しいマトリックスを作成しません。としても知っていたオブジェクトに新しい名前を付けただけですA。数値のリストのリストである場合は、copy.deepcopyを使用して完全なコピーを作成することをお勧めします。numpy 配列の場合は、copyメソッドを使用できます。

于 2015-02-01T23:43:23.127 に答える
1
new_mat = A[:]

これにより、リストを参照するだけでなく、リストのコピーが作成されます。試してみる。

[:]最初から最後までスライスを指定するだけです。[1:]たとえば、要素 1から最後まで、または要素 1 から 4 までということもでき[1:4]ます。それに関するリストのスライスをチェックしてください。

于 2015-02-01T23:41:00.570 に答える
1

これは他の誰かを助けるかもしれません。これを行うだけです。

import copy

def zeros(A):
    new_mat = copy.deepcopy(A)
于 2017-10-27T03:37:16.487 に答える