生成随机2D格:Python多次追加同一行,而不是每次追加新行

2024-06-28 19:50:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Python中随机生成一个2d20x20晶格,其中包含1和-1。我正在生成20个不同的行,在我真正尝试将生成的行追加到大数组A之前,一切似乎都很顺利。print函数返回20个不同的随机生成的行,就像我想要的那样,但是当我添加append函数时,它只将第一个生成的行追加到数组中20次。在

这似乎是件简单的事,但不知怎么的,我很困惑。你能给我解释一下为什么会这样吗?我怎样才能解决它?这是我的代码:

from random import randint
# generating the lattice 
A = []
row = [0]*20
def genrow():
    for i in range(0,20):
        p = randint(1,100)
        if p < 50:
            row[i] = 1
        else:
            row[i] = -1
    return row

def newrow():                
    for j in range(0,20):
        genrow()
        print(row)
        A.append(row)

newrow()

print(A)

Tags: 函数代码infromfordefrange数组
3条回答

这是因为您使用的是全局row,并且列表是可变的,所以您将一个链接附加到该行,但是您一次又一次地更改此行。在

一种可能的解决方案是在追加之前复制行:

from random import randint
# generating the lattice 
A = []

def genrow():
    for i in range(0,20):
        p = randint(1,100)
        if p < 50:
            row[i] = 1
        else:
            row[i] = -1
    return row

def newrow():                
    for j in range(0,20):
        genrow()
        #print(row)
        A.append(row.copy()) # Copy it before appending.

newrow()

print(A)

另一种方法是在函数中创建新行并附加这些行:

^{pr2}$

你甚至可以用列表理解来缩短它:

from random import randint
# generating the lattice

def genrow():     
    return [1 if randint(1,100) < 50 else -1 for _ in range(20)]

def newrow(): 
    return [genrow() for _ in range(20)]

A = newrow()
print(A)

我们甚至可以将这些列表理解合并为一个:

def newrow(): 
    return [[1 if randint(1,100) < 50 else -1 for _ in range(20)] for _ in range(20)]

请注意,这些都在用不同的复杂性和方法做同样的事情。重要的事实是,您要么copy,要么创建新的附加列表。所有其他的东西只是让它变短(可能更快)。在

列表是一个可变的对象,所以如果您有row_1 = row,然后row_2 = row,那么当您更改row_1row_2也将被修改。在

这就是你要做的(假设缩进和我在评论中猜测的一样)

您有一个全局变量行,您可以在函数genrow()中随时修改该行并覆盖旧的结果。 注意,您的函数没有输入,但是即使将这个变量传递给函数也不会有帮助。因为它是一个变量,在函数内部和外部有许多不同的名称。在

您需要在函数中生成新行。这就是全部!在

有趣的是,为了进一步阅读,this link我今天得到了推荐,这是您需要理解的(如果您愿意,您只需要只需在genrow()内分配行)。在


或者,为了简洁起见,以下是您需要的所有代码:

import numpy as np
A = 2 * np.random.randint(0, 2, (20, 20)) - 1

仅此而已。。。幻灭,不是吗?:)

以下两段代码都应该在genrow函数定义中缩进。在

row = [0]*20

以及

^{pr2}$

现在执行20x的唯一代码是

for i in range(0,20):
        p = randint(1,100)

行仅被更改一次。在

相关问题 更多 >