我尝试根据两个变量生成多维列表:dim
和dim = 3
。它们都是用用户输入初始化的,所以在编码时我不知道它们的值。 size = 2
和[[['+', '+'], ['+', '+']], [['+', '+'], ['+', '+']]]
的示例为:import copy
fields = '+'
for i in range(dim):
fields = [copy.copy(fields) for j in range(size)]
。到目前为止我尝试了什么:
dim in [1, 2]
虽然这对dim > 2
完全正常,但只有size = 3
才会创建对同一列表的引用。 dim = 3
和>>> f
[[['+', '+', '+'], ['+', '+', '+'], ['+', '+', '+']], [['+', '+', '+'], ['+', '+', '+'], ['+', '+', '+']], [['+', '+', '+'], ['+', '+', '+'], ['+', '+', '+']]]
>>> f[0][0][0] = 'X'
>>> f
[[['X', '+', '+'], ['+', '+', '+'], ['+', '+', '+']], [['X', '+', '+'], ['+', '+', '+'], ['+', '+', '+']], [['X', '+', '+'], ['+', '+', '+'], ['+', '+', '+']]]
的示例:
f = [[['+'] * 3] * 3] * 3
我从copy.copy()
这样的代码中了解这种行为,并认为我可以使用<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(document).keyup(function(cfunc) {
if (cfunc.keyCode == 83) {
alert("S button");
}
if (cfunc.keyCode == 84) {
alert("T button");
}
if (cfunc.keyCode == 67) {
alert("C button");
}
});
</script>
阻止它,但这显然不起作用。我在Android(QPython 3)上使用Python 3.2.2和在Windows上使用Python 2.7尝试了这个,我得到了相同的结果。请注意,我不想要使用像numpy这样的非标准库。
答案 0 :(得分:2)
您可以使用copy.deepcopy()。 copy.copy()只是浅层复制。
这两种方法之间的区别:
浅层复制和深层复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:
浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中找到的对象。
深层复制构造一个新的复合对象,然后以递归方式将副本插入到原始对象中找到的对象。
答案 1 :(得分:0)
我会使用numpy数组来提供更方便的切片和索引操作。还允许更多维度而不是2-3和更清晰的代码。
import numpy as np
X = np.empty((width, height), dtype=object)
然后你可以通过你想要的方法填写它,例如:
import itertools
for x, y in itertools.product(range(width), range(height)):
X[x, y] = '+'