在循环每次迭代开始时将变量重新赋值为原始值(循环前定义)
在Python中,当你想在每次循环开始时把一个变量重新赋值为之前定义的原始值时,可以使用[:]
。也就是说:
original_1D = ['o', 'o', 'o']
for i in range(0,3):
new = original_1D[:] # revert back to 'original_1D' list defined before loop
new[i] = 'X'
print new
这样做会产生你想要的结果:
['X', 'o', 'o']
['o', 'X', 'o']
['o', 'o', 'X']
我的问题出现在原始列表是多维的(original_2D
)时。例如:
original_2D = [['o', 'o', 'o'],['o', 'o', 'o']]
for i in range(0,3):
new = original_2D[:] # revert back to 'original_2D' list defined before loop
new[0][i] = 'X'
print new
从这个,我想要得到以下输出:
# Desired
[['X', 'o', 'o'], ['o', 'o', 'o']]
[['o', 'X', 'o'], ['o', 'o', 'o']]
[['o', 'o', 'X'], ['o', 'o', 'o']]
但是不行!我得到的是:
# Actual
[['X', 'o', 'o'], ['o', 'o', 'o']]
[['X', 'X', 'o'], ['o', 'o', 'o']]
[['X', 'X', 'X'], ['o', 'o', 'o']]
就好像每次循环时,original_2D
列表都被覆盖了一样。
我哪里做错了呢?
3 个回答
在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有人可能会在使用某个功能时,发现它并没有按照预期工作。这种情况下,我们需要仔细检查代码,看看是不是哪里出错了。
通常,解决问题的第一步是理解错误信息。错误信息就像是程序在告诉我们:“嘿,我遇到麻烦了!”它们可以帮助我们找到问题的根源。接下来,我们可以尝试查找相关的文档或者在网上搜索,看看有没有人遇到过类似的问题,并找到了解决方案。
如果还是解决不了,向社区求助也是一个好办法。像StackOverflow这样的论坛上,有很多经验丰富的程序员,他们乐于分享自己的知识和经验。我们可以把自己的问题描述清楚,附上相关的代码,这样别人就能更好地理解我们的困境,并给出建议。
总之,遇到问题时不要慌张,冷静下来,逐步分析,寻找解决方案。编程的过程就是不断学习和解决问题的过程。
import copy
original_2D = [['o', 'o', 'o'],['o', 'o', 'o']]
for i in range(0,3):
new = copy.deepcopy(original_2D[:])
new[0][i] = 'X'
print new
在Python中,列表总是通过对象引用来传递的。这意味着如果你像之前那样复制一个包含列表的列表,你得到的仍然是同样的列表引用。所以你需要做一个深拷贝来解决这个问题。你可以导入下面的包,然后把这一行 new = original_2D[:]
改成:
from copy import deepcopy
original_2D = [['o', 'o', 'o'],['o', 'o', 'o']]
for i in range(0,3):
new = deepcopy(original_2D) # Change this line.
new[0][i] = 'X'
print new
在Python中,当你想把一个变量重新赋值为原来的值时,可以使用
[:]
。
其实,这个符号是用来创建一个完整的切片(也就是一个浅拷贝)的,适用于一种叫做序列的东西。如果原来的值是不可变的序列(比如字符串和元组),那就没必要使用这个符号;而如果原来的值根本不是序列,那就用不了。
我特别强调了浅拷贝,因为通过这个切片创建的新对象其实是指向和原对象相同的东西。如果你的原序列里面有可变对象的引用(比如列表),这可能会引发一些问题。
你可以使用copy.deepcopy
来创建一个深拷贝(而不是浅拷贝):
from copy import deepcopy
new = deepcopy(original2D)
或者你也可以通过显式地创建子列表的浅拷贝,比如使用列表推导式
:new = [row[:] for row in original2D]
前者在处理更高维度的数据时更容易扩展。