Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么将此函数应用于未作为参数调用的变量?_Python_Python 3.x_Function_Coordinates_Nested Lists - Fatal编程技术网

Python 为什么将此函数应用于未作为参数调用的变量?

Python 为什么将此函数应用于未作为参数调用的变量?,python,python-3.x,function,coordinates,nested-lists,Python,Python 3.x,Function,Coordinates,Nested Lists,我在尝试编写一些代码时遇到了问题 我试图获取一个坐标列表(表示3D中形状的可能位置)并形成一个列表,该列表包含原始列表中的所有元素,此外,原始列表中的元素也进行了旋转,以便[x,y,z]坐标也被移动,包括[z,x,y]和[y,z,x] 我认为最好用一个例子来说明这一点: 获取列表(表示2x2x1块的可能位置,因此为“二乘二”): (椭圆代表更相似的坐标列表)我试图形成完整的列表: two_by_two_comp = [ [[-1, -1, 1], [-1, -1, 0], [-1,

我在尝试编写一些代码时遇到了问题

我试图获取一个坐标列表(表示3D中形状的可能位置)并形成一个列表,该列表包含原始列表中的所有元素,此外,原始列表中的元素也进行了旋转,以便[x,y,z]坐标也被移动,包括[z,x,y]和[y,z,x]

我认为最好用一个例子来说明这一点:

获取列表(表示2x2x1块的可能位置,因此为“二乘二”):

(椭圆代表更相似的坐标列表)我试图形成完整的列表:

two_by_two_comp = [
    [[-1, -1, 1],  [-1, -1, 0],  [-1, 0, 0],   [-1, 0, 1]],
    [[-1, -1, 0],  [-1, -1, -1], [-1, 0, -1],  [-1, 0, 0]]
    ...
    [[1, -1, -1],  [0, -1, -1],  [0, -1, 0],   [1, -1, 0]],
    [[0, -1, -1],  [-1, -1, -1], [-1, -1, 0],  [0, -1, 0]]
    ...
    [[-1, 1, -1],  [-1, 0, -1],  [0, 0, -1],   [0, 1, -1]],
    [[-1, 0, -1],  [-1, -1, -1], [0, -1, -1],  [0, 0, -1]]
    ...
]
我希望这是清楚的

我试图通过使用一个函数来实现这一点,该函数将所有坐标以2×2的方式移动:

two_by_two = [
    [[-1, -1, 1],  [-1, -1, 0],  [-1, 0, 0],   [-1, 0, 1]],
    [[-1, -1, 0],  [-1, -1, -1], [-1, 0, -1],  [-1, 0, 0]]
    ...
]
# function to change [x, y, z] to [z, x, y]
def rotate_coordinates(parameter):
    coord_list = parameter[len(parameter) - 1]
    coordinates = coord_list[len(coord_list) - 1]

    z_coordinate = coordinates[2]
    coordinates.pop()
    coordinates.insert(0, z_coordinate)


# function to change list[x, y, z] to list[z, x, y]
def rotate_coord_list(parameter):
    coord_list = parameter[len(parameter) - 1]
    a = len(coord_list)
    while a > 0:
        coordinates = coord_list[len(coord_list) - 1]
        rotate_coordinates(parameter)
        coord_list.pop()
        coord_list.insert(0, coordinates)
        a = a - 1


# function to change list[list[x, y, z]] to list[list[z, x, y]]
def rotate_positions_list(parameter):
    b = len(parameter)
    while b > 0:
        coord_list = parameter[len(parameter) - 1]
        rotate_coord_list(parameter)
        parameter.pop()
        parameter.insert(0, coord_list)
        b = b - 1
在我看来,这似乎是成功的,因为当我跑步时:

print(two_by_two)
rotate_positions_list(two_by_two)
print(two_by_two)
它输出:

[[[-1, -1, 1], [-1, -1, 0],  [-1, 0, 0],  [-1, 0, 1]], 
 [[-1, -1, 0], [-1, -1, -1], [-1, 0, -1], [-1, 0, 0]]
...]

[[[1, -1, -1], [0, -1, -1],  [0, -1, 0],  [1, -1, 0]], 
 [[0, -1, -1], [-1, -1, -1], [-1, -1, 0], [0, -1, 0]]
...]
所以它按照我的意图移动了所有的坐标,当我试图开始创建两个两个的comp时,问题就出现了:

two_by_two_comp = []
two_by_two_comp.extend(two_by_two)
print(two_by_two_comp)

rotate_positions_list(two_by_two)
two_by_two_comp.extend(two_by_two)
print(two_by_two_comp)
返回:

[[[-1, -1, 1], [-1, -1, 0],  [-1, 0, 0],  [-1, 0, 1]], 
 [[-1, -1, 0], [-1, -1, -1], [-1, 0, -1], [-1, 0, 0]]
...]

[[[1, -1, -1], [0, -1, -1],  [0, -1, 0],  [1, -1, 0]], 
 [[0, -1, -1], [-1, -1, -1], [-1, -1, 0], [0, -1, 0]],
... 
 [[1, -1, -1], [0, -1, -1],  [0, -1, 0],  [1, -1, 0]], 
 [[0, -1, -1], [-1, -1, -1], [-1, -1, 0], [0, -1, 0]]
...]
因此,我最终得到了复制的two_by_two的相同“版本”,而不是移位的原始版本,我不知道为什么我打印的two_by_two comp部分首先会受到rotate_Positions_list(two_by_two)函数的影响

如果有人能澄清我的困惑,我将不胜感激。我将在下面的一部分中包含完整的脚本

谢谢,, 丹


您的问题在于深度复制和浅层复制之间的区别。按照

Python中的赋值语句不复制对象,而是在目标和对象之间创建绑定。对于可变的或包含可变项的集合,有时需要一个副本,以便可以在不更改另一个副本的情况下更改一个副本

因此,问题在于:

two_by_two_comp.extend(two_by_two)
让我用两个列表
a
b
举例说明:

a=[[2,3,4],[1,2,3]]
b=[]
b、 延长(a)
现在让我们假设我修改了
a
中的某些内容:

a[0].append(3)
print(a)   #  [[2, 3, 4, 3], [1, 2, 3]]
一切都很好,但同时看看
b
发生了什么:

print(b)  #  [[2, 3, 4, 3], [1, 2, 3]]
它也被修改了

为了实现您想要的,您需要创建一个
two\u by\u two
的深度副本,否则您将只引用相同的内存地址。长话短说,而不是:

two_by_two_comp.extend(two_by_two)
你必须做到:

two_by_two_comp.extend(copy.deepcopy(two_by_two))
不要忘记导入脚本顶部的复制模块:

import copy 
import copy