如何通过值获取Python类属性?
在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
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通过引用传递
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中既没有“按值”也没有“按引用”。对象本身就是事物,名称、属性或槽仅仅指向它们。没有“属性跟踪更改”,您所做的是向单个列表对象添加一个由多个名称已知的项。同样,复制不会“取消跟踪”对象,而是创建一个新的、独立的对象。对于某些事情,想要复制它们是没有意义的:套接字表示程序外部的唯一事物,复制表示不会影响实际的外部事物。谢谢!我想我最初忽略了可变/不可变对象的概念。这就解释了我所说的通过价值和引用的最好的东西。此外,从这个角度考虑传递/返回对象并评估其效果(例如,在多个线程可能存在争用条件的情况下)也会有很大帮助。