如何按值获取 Python class 属性?

How to get Python class attribute by value?

如何通过值而不是通过引用获取 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 通过引用

  1. python 中的一切都是对象。甚至原始数据类型(例如 intstr、...)也是。
  2. 任何变量始终是对对象的引用。没有办法只传递值。

你可以试试下面的练习

a = [1, 2]  # creating new object and assigning it to `a`
b = a       # now both `a` and `b` refer to same object

a.append(3) # we add 3 to the list, `a` and `b` still refer to same object
a is b      # this returns `True` as we compare object to itself

a = [100]   # creating new object and making `a` to refer to it
a is b      # now this is `False`, `b` still refers to the old object

有些对象是不可变的

另一个python概念是不变性。不可变对象是那些一旦创建就永远不会改变其值的对象。您只能用不同的对象替换它们。

最常见的类型是:

  • 不可变:intstrfloattuplefrozensetbytes
  • 可变:listdictset

在 python 中,传递不可变对象与按值传递一样接近。因为您可以确定它不会受到任何影响。当你需要传递可变对象并且你想确保它不会被改变时,你可以复制。