2012-01-01 128 views
3

指的是一个项目的名单上有从从另一个列表中(数组listB)变量(listA的)的列表。我遇到的问题是listB中的项目正在按值传递给listA而不是通过引用。无论如何,我可以访问listB中的对象后,已将它的值在listA?Python从另一个列表

例如:

listB = [1,2,3,4,5] 
listA = [listB[0], listB[1]] 
listA[0] = 0 

这使得listA的等于[0,2],和叶数组listB不变。我想修改listB,使它变成[0,2,3,4,5]。

我当然有拿出一个解决的办法,但它的丑陋,我在想,如果有这样的一种优雅的方式。

+0

你不能。如果你想帮助解除一段代码:发布在http://codereview.stackexchange.com。有人会指出你的问题更优雅的解决方案。 – 2012-01-01 01:20:02

回答

1

一切都在蟒蛇是一个参考。所有这些语句执行后,listB[1]listA[1]字面上同一个对象。 (你可以检查,通过调用id(listB[1])id(listA[1])

原因listA[0]listB[0]是不同的仅仅是因为你把不同的参考到那个地方。

从你的描述来看,你不想给一个。listA存储在listB的对象引用你需要的是一个listA这是一个鉴于listB我相信你只有两种选择:

  • 创建一个特殊的序列内部存储参考listA,且其__getitem____setitem__方法被调用时执行查找到listA

  • 创建特别是包含有类似“序列和索引”特殊的引用类型。将这些参考文献放入listA。但是,要修改listBlistA,您必须调用这些引用对象的某种“获取”和“设置”成员。

1

你不能。首先整数是不可变的,它们不像C/C++中的整数那样工作。你不能得到一个整数的指针/引用,然后改变它(我的意思是你可以,你总是有一个引用,但它通常引用单个对象;请检查这个x = 1; y = 1; print id(x), id(y); id值应该是相同的,它们是内存地址)。你可以做的就是元素的索引数组listB和更改列表,例如:

listA = [0, 1] 
listB[listA[0]] = 0 

可能是你试图做一些你不应该做的,因为Python的工作方式不同于C++。你想达到什么目的?

+0

我有一个大小为n的数据矩阵,我正在检查该矩阵的每个可能的2x2子集。然后我将这个2x2子集的4个值存储在一个列表中,并检查它们的值。根据该2x2子集的内容,我必须修改大小为n的原始数据矩阵。 我认为同样的事情,存储2x2矩阵所保持的原始矩阵的索引,但是这需要更复杂的数据类型和/或不太优雅的解决方案。由于我试图提高我的python编程技能,我想知道是否有pythonian /优雅的做这个。 – 2012-01-01 01:23:16

+1

对于这样的事情,我相信你应该使用NumPy或SciPy,这是为此创建的python库。如果你想使用纯Python,你最好的选择是记住子表的索引并改变列表中的值。只需将该子矩阵存储的值存储在该子矩阵的顶部角落,并在原始表格中更改值即可。也许你可以在C或C++中展示一个简短的代码片段(但认真,简短),我们可以尝试在Python中使用代码,这也是一样的。 – gruszczy 2012-01-01 01:24:50

+0

@AmeerOpat,对于你在做什么我没有一个真正清晰的想法,但我会建议考虑创建一个新的矩阵,而不是修改现有的矩阵。这通常会产生更多pythonic解决方案。 (正如我上面提到的,如果您在代码审查上发布更好的反馈) – 2012-01-01 01:40:18