如何通过值获取Python类属性?

如何通过值获取Python类属性?,python,attributes,Python,Attributes,在Python中,如何通过值而不是引用获取对象属性?我的意思是,在获取对象属性并将其分配给变量之后,变量不应该跟踪可能发生在属性上的更改 以下是一个例子: class SomeClass: def __init__(self): self.array = [] def add(self): self.array.append(1) def getValue(self): return self.array s = Some

在Python中,如何通过值而不是引用获取对象属性?我的意思是,在获取对象属性并将其分配给变量之后,变量不应该跟踪可能发生在属性上的更改

以下是一个例子:

class SomeClass:
    def __init__(self):
        self.array = []
    def add(self):
        self.array.append(1)
    def getValue(self):
        return self.array

s = SomeClass()
v = s.getValue()
print(v)  # prints [], as it should 
s.add()   # changes the object's attribute
print(v)  # prints [1], because v is tracking s.array
# how to implement a getter that would keep v the value when it was assinged?

我可以使用
copy.deepcopy()
部分解决这个问题,但这并不适用于所有数据类型(例如套接字对象)。

我相信您对python的工作原理有一些误解

Python通过引用传递
  • python中的一切都是对象。甚至原始数据类型(例如,
    int
    str
    ,…)也是如此
  • 任何变量始终是对对象的引用。没有办法只传递值
  • 你可以试试下面的练习

    a=[1,2]#创建新对象并将其分配给`a`
    b=a#现在‘a’和‘b’都指同一个对象
    a、 追加(3)#我们在列表中加上3,`a`和`b`仍然指同一个对象
    a是b#当我们将对象与自身进行比较时,返回'True'
    a=[100]#创建新对象并使'a'引用它
    a是b#现在这是'False','b'仍然是指旧对象
    
    有些对象是不可变的 python的另一个概念是不变性。不可变对象是那些在创建后无论发生什么都无法更改其值的对象。只能用不同的对象替换它们

    最常见的类型有:

    • 不可变:
      int
      str
      float
      tuple
      frozenset
      字节
    • 可变:
      list
      dict
      set

    传递不可变对象与传递python中的值非常接近。因为你可以确定它不会受到任何影响。当您需要传递可变对象,并且希望确保该对象未被更改时,您可以进行复制。

    没有通用的方法可以做到这一点。以套接字为例,您希望在那里实际发生什么?函数返回一个新的未连接套接字?那就没必要叫它了。调用返回原始套接字并用新的未连接套接字替换对象中的套接字?然后您已经更改了属性,这听起来不像您想要的(对于“get”函数来说,可以明显地修改对象是不寻常的)。Python中既没有“按值”也没有“按引用”。对象本身就是事物,名称、属性或槽仅仅指向它们。没有“属性跟踪更改”,您所做的是向单个列表对象添加一个由多个名称已知的项。同样,复制不会“取消跟踪”对象,而是创建一个新的、独立的对象。对于某些事情,想要复制它们是没有意义的:套接字表示程序外部的唯一事物,复制表示不会影响实际的外部事物。谢谢!我想我最初忽略了可变/不可变对象的概念。这就解释了我所说的通过价值和引用的最好的东西。此外,从这个角度考虑传递/返回对象并评估其效果(例如,在多个线程可能存在争用条件的情况下)也会有很大帮助。