值在python中的任何地方都会发生变化

2024-04-26 21:43:59 发布

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

sz = input('Enter the size of the board: ')
board = [[0 for j in xrange(sz)] for i in xrange(sz)]

for row in range(sz):
    for col in range(sz):
        board[row][col] = input()

pqval = 1
steps = 2
start_state = sz , board , pqval ,steps

t=1
for row in range(sz):
    for col in range(sz):
        board[row][col] = t
        t=t+1
board[sz-1][sz-1] = 0
end_state = sz, board , pqval ,steps

print "Here is the starting position: "
print start_state

print "Here is the ending position: "
print end_state

我不明白为什么更改也发生在startu state的board属性中,即使它是在更早的时候构建的。我肯定在做傻事。新的Python和来自C/C++背景的行为似乎很奇怪。你知道吗

如果我希望元组具有所有4个值,并且希望更改一个元组的属性,而不需要到处复制,那么解决方法是什么?你知道吗


Tags: theinboardforinputrangecolsteps
1条回答
网友
1楼 · 发布于 2024-04-26 21:43:59
在Python中,赋值与C++有很大的不同,事实上,变量的概念是不同的。你知道吗

    在C++中,变量是一个存储地址,其中存储值,并与类型一起存储。可以获取变量的引用甚至指针。赋值意味着将一个值从一个变量复制到另一个变量。*
  • 在Python中,值负责自己的存储和类型;变量只是值的名称。一个值可以有任意数量的名称**

*…通常;您可以覆盖它以表示您想要的任何内容。

任何正数。一旦它没有名字,它将被垃圾收集器清除。


在一些简单的案例中,你可能知道这一点:

>>> a = [0]
>>> b = a
>>> b[0]
0
>>> a[0] = 1
>>> b[0]
1

但在每一个案例中都是如此。所以,当你这么做的时候:

start_state = sz , board , pqval ,steps

…这只意味着start_state[1]成为同一board对象的另一个名称。start_state[1]是一个“复杂目标”而不是一个普通变量这一事实并不重要;您通过赋值给start_state而不是直接赋值给start_state[1]间接创建它的事实并不重要;它仍然是一个名称。你知道吗

当然,对于szpqvalsteps也是如此,但是你永远不会改变那些值,因为你不能改变字符串和数字。你知道吗

重新分配pqval并不会将1变成一个不同的数字;*它只是使pqval成为一个不同数字的名称,而使start_state[2]仍然是原始数字的名称。同样,重新分配board也不会影响start_state[1]。只有突变board才能做到这一点。你知道吗

*如果你能做到这一点,那将是一个超级大国的地狱,但它的任何使用都可能会打破宇宙…

当使用像{{CD16>}这样的操作符时,这会变得有点棘手,尤其是如果你习惯C++。在C++中,^ {< CD16> }总是意味着对变量进行变异,不管它是否意味着突变一个值;当不能改变变量时,^ {< CD16> }就不起作用。在Python中,没有“变异一个变量”这样的东西;它总是意味着重新指派一个变量,不管它是否意味着变异一个值;当你不能变异一个值时,+=只需要重新指派一个新的值。你知道吗


如果你想复制,你必须明确地做。例如,其中任何一个都可以:

start_state = sz, board[:], pqval, steps
start_state = sz, copy.copy(board), pqval, steps
start_state = copy.deepcopy((sz, board, pqval, steps))

或者,您也可以使board以与其他对象相同的方式工作—从不改变它,只将它重新分配给新列表。例如,与此相反:

    board[row][col] = t

…你可以:

    board = [[val if i, j != row, col else t for j, val in enumerate(row)]
             for i, row in enumerate(board)]

当然,这有点愚蠢,但通常你可以重写一个循环作为一个列表,生成一个新的列表,这不是愚蠢的。例如:

board = [[i*sz+j for j in range(sz)] for i in range(sz)]

相关问题 更多 >