我尝试在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)
这是因为您使用的是全局
row
,并且列表是可变的,所以您将一个链接附加到该行,但是您一次又一次地更改此行。在一种可能的解决方案是在追加之前复制行:
另一种方法是在函数中创建新行并附加这些行:
^{pr2}$你甚至可以用列表理解来缩短它:
我们甚至可以将这些列表理解合并为一个:
请注意,这些都在用不同的复杂性和方法做同样的事情。重要的事实是,您要么
copy
,要么创建新的附加列表。所有其他的东西只是让它变短(可能更快)。在列表是一个可变的对象,所以如果您有
row_1 = row
,然后row_2 = row
,那么当您更改row_1
,row_2
也将被修改。在这就是你要做的(假设缩进和我在评论中猜测的一样)
您有一个全局变量行,您可以在函数
genrow()
中随时修改该行并覆盖旧的结果。 注意,您的函数没有输入,但是即使将这个变量传递给函数也不会有帮助。因为它是一个变量,在函数内部和外部有许多不同的名称。在您需要在函数中生成新行。这就是全部!在
有趣的是,为了进一步阅读,this link我今天得到了推荐,这是您需要理解的(如果您愿意,您只需要只需在
genrow()
内分配行)。在或者,为了简洁起见,以下是您需要的所有代码:
仅此而已。。。幻灭,不是吗?:)
以下两段代码都应该在genrow函数定义中缩进。在
以及
^{pr2}$现在执行20x的唯一代码是
行仅被更改一次。在
相关问题 更多 >
编程相关推荐