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个值,并且希望更改一个元组的属性,而不需要到处复制,那么解决方法是什么?你知道吗
*…通常;您可以覆盖它以表示您想要的任何内容。
任何正数。一旦它没有名字,它将被垃圾收集器清除。
在一些简单的案例中,你可能知道这一点:
但在每一个案例中都是如此。所以,当你这么做的时候:
…这只意味着
start_state[1]
成为同一board
对象的另一个名称。start_state[1]
是一个“复杂目标”而不是一个普通变量这一事实并不重要;您通过赋值给start_state
而不是直接赋值给start_state[1]
间接创建它的事实并不重要;它仍然是一个名称。你知道吗当然,对于
sz
、pqval
和steps
也是如此,但是你永远不会改变那些值,因为你不能改变字符串和数字。你知道吗重新分配
pqval
并不会将1
变成一个不同的数字;*它只是使pqval
成为一个不同数字的名称,而使start_state[2]
仍然是原始数字的名称。同样,重新分配board
也不会影响start_state[1]
。只有突变board
才能做到这一点。你知道吗*如果你能做到这一点,那将是一个超级大国的地狱,但它的任何使用都可能会打破宇宙…
当使用像{{CD16>}这样的操作符时,这会变得有点棘手,尤其是如果你习惯C++。在C++中,^ {< CD16> }总是意味着对变量进行变异,不管它是否意味着突变一个值;当不能改变变量时,^ {< CD16> }就不起作用。在Python中,没有“变异一个变量”这样的东西;它总是意味着重新指派一个变量,不管它是否意味着变异一个值;当你不能变异一个值时,+=
只需要重新指派一个新的值。你知道吗如果你想复制,你必须明确地做。例如,其中任何一个都可以:
或者,您也可以使
board
以与其他对象相同的方式工作—从不改变它,只将它重新分配给新列表。例如,与此相反:…你可以:
当然,这有点愚蠢,但通常你可以重写一个循环作为一个列表,生成一个新的列表,这不是愚蠢的。例如:
相关问题 更多 >
编程相关推荐