gpt4 book ai didi

python - 是否可以为数字制作包装对象,例如 float ,使其可变?

转载 作者:行者123 更新时间:2023-11-28 16:24:43 24 4
gpt4 key购买 nike

在 Python 3 中,一切都应该是对象,甚至是数字,但它们不可变

是否可以为数字创建包装器对象,例如float,这样它的行为就和普通数字完全一样,只是它必须是可变的?

我想知道通过创建从 float 派生的匿名包装对象,但将其行为更改为可变,使用内置 type 函数是否可行。

>>> f = lambda x : type('', (float,), dict())(x)
>>> a = f(9)
>>> a
9.0

我必须更改哪些参数 f 才能使数字 a 可变?

我如何验证一个数字是否可变:

我必须能够创建这样的函数 f ,它将从整数值创建一个浮点值,并且在浅拷贝之后它将以下列方式运行:

>>> list_1 = [f(i) for i in [1, 2, 3, 4]]
>>> list_1
[1.0, 2.0, 3.0, 4.0]
>>> list_2 = copy.copy(list_1)
>>> list_1[0] *= 100
>>> list_1
[100.0, 2.0, 3.0, 4.0]
>>> list_2
[100.0, 2.0, 3.0, 4.0]

修改第一个列表,两个都改了。

也许我必须向 dict() 添加一些字段或添加额外的基类来强制执行可变性?

最佳答案

值是不可变的。它们是柏拉图式的。像 5 := 3 这样的表达式是荒谬的。可变的是位置,通常称为地址或指针。 Python 没有这些,但我们可以通过使用像 list 这样的容器类型来伪造它,它实际上是一个引用其他位置的位置。

这是可变数字类型的部分实现,它使用 list 来存储一个位置,我们将在该位置保留数字的值并在该位置更改该值时更改值,因为可变数字的所有副本将共享该位置,所有副本都将看到更改

import copy

# Convenience to work with both normal and mutable numbers
def _get_value(obj):
try:
return obj.value[0]
except:
return obj

class mutable_number(object):
def __init__(self, value):
# Mutable storage because `list` defines a location
self.value = [value]

# Define the comparison interface
def __eq__(self, other):
return _get_value(self) == _get_value(other)

def __ne__(self, other):
return _get_value(self) != _get_value(other)

# Define the numerical operator interface, returning new instances
# of mutable_number
def __add__(self, other):
return mutable_number(self.value[0] + _get_value(other))

def __mul__(self, other):
return mutable_number(self.value[0] * _get_value(other))

# In-place operations alter the shared location
def __iadd__(self, other):
self.value[0] += _get_value(other)
return self

def __imul__(self, other):
self.value[0] *= _get_value(other)
return self

# Define the copy interface
def __copy__(self):
new = mutable_number(0)
new.value = self.value
return new

def __repr__(self):
return repr(self.value[0])

x = mutable_number(1)
y = copy.copy(x)
y *= 5
print x

list_1 = [mutable_number(i) for i in [1, 2, 3, 4]]
list_2 = copy.copy(list_1)
list_1[0] *= 100
print list_1
print list_2

如果有什么不清楚的地方请告诉我,我可以添加更多文档

关于python - 是否可以为数字制作包装对象,例如 float ,使其可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37501632/

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