python - 我如何在python中将相同的列表对象分配给两个不同的变量名?

标签 python python-3.x inheritance memory-management namespaces

我一直在尝试解决我在高中时收到的这个愚蠢的冒泡排序程序,我试图制作一个自动排序类(class)(见代码)只是为了好玩,但是,有些事情让我感到不安

class AutoSortedArray:
    def __init__(self, array):
        self.lenarr = len(array)
        self.unsorted = array
        OGL = list(array)
        self.sorted = self.bsort(OGL)


    def bsort(self, array):
        for i in range(self.lenarr):
            for j in range(0, self.lenarr-i-1):
                if array[j] > array[j+1]:
                    array[j], array[j+1] = array[j+1], array[j]

        return tuple(array)


if __name__=="__main__":

    ASA=AutoSortedArray((5,8,2,1,3,6,4,7))

    print(ASA.unsorted)
    print(ASA.sorted)
现在的问题是,每当我尝试将它分配给不同的变量时,传递给我的类的参数“数组”似乎指向相同的内存地址,但我需要这样做,因为我需要 “未分类”名称未受影响 , 但是 python 为所有引用数组的名称分配相同的内存地址给我带来了问题,名称 unsorted 最后总是被修改和改变,ASA.unsorted 和 ASA.sorted 给出相同的结果,其中我的数组是预先排序的
现在这个问题如果发生在主块中就不会发生,因为被修改的 OGL 名称会分配给它一个单独的新内存地址,但这似乎没有发生在这里可能是由于某些类的事情。
所以这里是我的问题:
  • 我可以在 python 中将两个不同的可变对象分配给相同的值吗(不使用像 OGL = array[::1] 这样的愚蠢绕过),如果可能,如何?
  • 即使 OGL 被 bsort 的操作修改,为什么在我当前的代码中会发生这种情况,在修改时不应该为它分配一个新的内存地址吗?
  • 在 C++/Java 等其他 OOP 语言中是否也会发生同样的情况?
  • 最佳答案

    为了保持未排序数组不被排序数组进一步引用,您必须为此执行深层复制。

    class AutoSortedArray:
        def __init__(self, array):
            self.lenarr = len(array)
            self.unsorted = tuple(list(array).copy())
            OGL = list(array)
            self.sorted = self.bsort(OGL)
    
        def bsort(self, array):
            for i in range(self.lenarr):
                for j in range(0, self.lenarr-i-1):
                    if array[j] > array[j+1]:
                        array[j], array[j+1] = array[j+1], array[j]
    
            return tuple(array)
    
    
    if __name__ == "__main__":
    
        ASA = AutoSortedArray((5, 8, 2, 1, 3, 6, 4, 7))
    
        print(ASA.unsorted)
        print(ASA.sorted)
    

    关于python - 我如何在python中将相同的列表对象分配给两个不同的变量名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66165391/

    相关文章:

    python - Python unittest下的时间戳测试

    python - 尝试通过选择特定数据在 Python 中创建 3D 矩阵

    python - 如何在 Python 3 类 __init__ 函数中使用 **kwargs?

    Python:无法从 C 扩展继承

    python - 如何在 python 中使用 find_element_by_id()

    python - 文件内容没有预期的那么长

    python-3.x - 如何在DataFrame中共享style.apply结果的位置?

    javascript:属性究竟是如何从原型(prototype)继承的?

    java - 定义一个没有任何抽象方法的抽象类

    python - 为什么 list.remove() 在此 for 循环中不起作用?