gpt4 book ai didi

Python 对象引用

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:48 28 4
gpt4 key购买 nike

我对对象值如何在 python 中持久化感到有点困惑。

假设我有一个类对象a,它附加了一组特定的属性。多个类 BC 在创建它们时都有自己对类 a 的引用。只有 C 类可以修改 a 类中的内容。当它被修改时,B 类会选择它们吗?通过创建我自己的示例,他们似乎这样做了。

我的问题是,在任何情况下我应该知道何时不会采用更改? python什么时候创建类a的副本?更具体地说,什么将创建一个不会影响原始 a 的副本。

class A:

def __init__(self):
self.x = 1

def changeX(self,num):
self.x = num


class B:

def __init__(self,classA):
self.x = classA

class C:
def __init__(self,classA):
self.x = classA

def ChangeA(self,num):
self.x.changeX(num)

c_a = A()
c_b = B(c_a)
c_c = C(c_a)


c_c.ChangeA(2)

# All returns 2
c_a.x
c_b.x.x
c_c.x.x

最佳答案

Python 中的赋值语句不会复制对象,它们会在目标和对象之间创建绑定(bind)。

关于这与其他语言有何不同的易于理解的指南可用 here .

当您需要更改分配的对象以使其不影响其他分配的对象时,您可以使用copy 模块。 ( https://docs.python.org/3.4/library/copy.html )

import copy

class A:

def __init__(self):
self.x = 1

def changeX(self,num):
self.x = num


class B:

def __init__(self,classA):
self.x = classA

class C:
def __init__(self,classA):
self.x = classA

def ChangeA(self,num):
self.x.changeX(num)

c_a = A()
c_b = B(c_a)
c_c = copy.deepcopy(C(c_a))


c_c.ChangeA(2)

c_a.x #1
c_b.x.x #1
c_c.x.x #2

关于Python 对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653465/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com