对不可变的引用的Python集合

对不可变的引用的Python集合,python,reference,mutation,Python,Reference,Mutation,python中有没有一种方法可以获取引用列表?意思是,当我改变一个内部事物时,一个事物的集合会自动改变,而不需要参考集合本身 这将允许我在示例中显示的内容 发生了什么事 a=1 b=2 L=[a,b] 打印(L)#[1,2] b=3 打印(L)#[1,2] #我想要点像这样的 a=1 b=2 ra=参考(a) rb=参考(b) L=[ra,rb] 打印(L)#[1,2] b=3 打印(L)#[1,3] 编辑 如果在python中数字是可变的,那么我的第一个示例就可以工作。也就是说,如果重新分配

python中有没有一种方法可以获取引用列表?意思是,当我改变一个内部事物时,一个事物的集合会自动改变,而不需要参考集合本身

这将允许我在示例中显示的内容

发生了什么事 a=1 b=2 L=[a,b] 打印(L)#[1,2] b=3 打印(L)#[1,2] #我想要点像这样的 a=1 b=2 ra=参考(a) rb=参考(b) L=[ra,rb] 打印(L)#[1,2] b=3 打印(L)#[1,3] 编辑 如果在python中数字是可变的,那么我的第一个示例就可以工作。也就是说,如果重新分配(例如:
b=3
)意味着“通过标签“b”改变我们所指对象的内存”

我的第一个示例使用列表中的可变元素(例如,如果我构建了一个列表列表,并在不重新分配的情况下对内部列表进行了变异)

因此,更具体地说,我的问题是:当集合包含不可变元素时,我们是否有机会发生这种行为


(我特别感兴趣的是可调用项列表)。

在打印L的新值之前,将值b再次存储在L中,请查找以下代码:

a = 1
b = 2
L = [a, b]
print(L) # [1, 2]
b = 3
L=[a, b]
print(L) # [1, 3]
但这种方法并不有效。仅通过索引更新列表项。如下所示:

a = 1
b = 2
L = [a, b]
print(L) # [1, 2]
b = 3
L[1]=b
print(L) # [1, 3]
我们不能像您尝试在Python中使用引用那样做到这一点。
当您将整数放入列表时,列表将保存整数的副本。整数最初是变量、文字值、函数调用的结果还是其他内容都无关紧要;当列表看到它时,它只是一个整数值。

好的,找到了一种方法。我只是用可变包装器包装不可变的

例如,如果我们想要可变整数:

class mut_int:
定义初始化(自身,数据):
self.data=数据
def变异(自身、新_数据):
self.data=新数据
定义报告(自我):
返回报告(自身数据)
a=mut_int(1)
L=[a,a]
打印(L)#[1,1]
#从现在起,我们假设我们再也无法访问L
a、 突变(2)#模拟可变a=2
打印(L)#[2,2]#我们没有直接访问就更改了L,很好!
对于可变可调用项,类似地:

class mut_可调用:
定义初始化(self,func):
self.func=func
def变异(自身、新功能):
self.func=新函数
定义报告(自我):
返回报告(self.func)
定义调用(self,*args,**kwargs):
返回self.func(*args,**kwargs)
f=mut_可调用(λx:x)
L=[f,λx:f(x)+f(x),λx:f(f(x))]
打印([g(2)表示L中的g])
#输出:[2,4,2]
#即[身份(2),2+2,身份(身份(2))]
#从现在起,我们假设我们再也无法访问L
f、 变异(λx:x**2)
打印([g(2)表示L中的g])
#输出:[4,8,16]
#即[平方(2),2+2,平方(平方(2))]
不幸的是,这有点脆弱,因为python具有动态特性,并且不可能重载赋值(
a=3
)运算符。一旦你在一个可变的包装器上使用了一个普通的赋值,包装器就会丢失,我们又回到了原点

a=mut_int(1)
L=[a,a]
打印(L)#[1,1]
a、 变异(2)
打印(L)#[2,2]到目前为止还不错
a=3#!阿东!我们没有坚持api,a也不再是mut_int!
打印(L)#仍然[2,2]:(
a、 变异(4)#属性错误

如果有人找到一个更优雅和/或更符合人体工程学和/或更健壮的解决方案,我仍然期待着它!

我的要求是,我想改变L内部的东西,而不再提及L。这就是拥有一个参考集合的意义,所以如果我有,比如说,L[a,b,a,a,c,a,d],我可以说“改变a”L中所有的a都会改变。另外,我对我的问题进行了编辑,使其更加具体,因为它实际上只是关于不可变的集合。[a,b,a,a,b,c]-这将构造一个可变的列表。整数本质上是不可变的。当您迭代此列表时,您可以更改列表的内容,因为列表是可变的,但是,整数本身不会更改,因为它们是不可变的。Python在这里做什么(幕后)是创建一个值为1的新整数对象,并将指针切换到该新对象。谢谢。正如我在上一篇评论中所说的,我正在寻找一种解决方法,以解决我无法访问不可变集合引用但仍希望更改它的情况。或者,即使我有了它,我也希望以更符合人体工程学的方式更改所有va取决于某个变量的LUE(例如,该变量可能在集合中出现多次)。有关实现此解决方法的方法,请参见我的答案。您基本上回答了自己的问题-Python已通过引用引用每个对象。问题在于您为不可变对象重新分配对象引用,或者只是没有为可变对象使用可用方法。当您处理不可变对象集合时对于le元素,您应该直接使用集合本身。这可能也会引起您的兴趣: