Python如何使用另一个实例启动新实例';属性而不引用其原始实例?

Python如何使用另一个实例启动新实例';属性而不引用其原始实例?,python,Python,我有一个类定义如下: class Lock(): 定义初始化(self,shape='',path=[]): self.shape=列表(形状) self.\u路径=路径 我正在尝试定义一个新函数来获取此自实例的邻居: def邻居(自身): 节点=[] 对于i,轮在枚举(self.shape)中: 对于(1,-1)中的j: lock=lock(self.shape、self.path) shape=lock.shape num=int(车轮)+j 如果num==-1: num=9 elif n

我有一个类定义如下:

class Lock():
定义初始化(self,shape='',path=[]):
self.shape=列表(形状)
self.\u路径=路径
我正在尝试定义一个新函数来获取此自实例的邻居:

def邻居(自身):
节点=[]
对于i,轮在枚举(self.shape)中:
对于(1,-1)中的j:
lock=lock(self.shape、self.path)
shape=lock.shape
num=int(车轮)+j
如果num==-1:
num=9
elif num==10:
num=0
形状[i]=str(num)
锁定。添加路径(形状)
nodes.append(锁)
返回节点
def添加路径(自身,x):
self.\u path.append(x)
此线路上的问题碰巧是错误的:

lock=lock(self.shape,self.path)
,我注意到,如果我更改了新实例lock.shape或lock.path,则self-instance属性将一起更改。因此,在for循环之后,self.\u path属性被多次修改。我理解这是因为lock属性指回self属性,所以它最终会更改self的属性


除了使用复制模块,是否有一种方法可以将对旧实例的引用分离出来,但改用其值?

列表还提供了其他方法来创建软拷贝,而无需调用
复制
模块。以下是几点:

lst = [1, 2, 3]
lst[:]       # copy-slice
list(lst)    # creates a new list with the same set of elements
lst.copy()   # the list class has this method
在调用构造函数之前,只需使用其中任何一项,它的行为应符合您的要求:

lock = Lock(self.shape[:], self._path[:])

(请注意,目前您不需要使用
.shape
,因为构造函数已经使用
list()
复制了它,但也不会造成任何伤害)

按照您当前的操作方式,
self.shape
不应该显示此行为(因为
list()
返回软拷贝)但是路径应该是。尝试将副本切片传递到构造函数:
lock=lock(self.shape[:],self.path[:])
。这应该可以创建列表的软拷贝,而不必调用
copy
模块。哦,是的,self.shape没有显示这种行为。所以我尝试了你的建议,也改变了自我。_path=list(path)也有效。如果你把答案贴出来,我会接受的。