我刚开始使用python,遇到了一些奇怪的事情。
下面的代码将x=1和y=2的坐标分配给变量test。test2变量为自己分配与TEST值相同的值,然后test2的x值被更改为旧的x值减1。但是,当执行最后一部分时,它不仅从test2中的x值减去1,还对test变量中的x值执行相同的操作。
test = [1,2];
test2 = test;
test2[1] = test2[1] - 1;我发现执行以下操作很好,但是我仍然不明白为什么第一个方法改变了测试值和test2值。
test = [1,2];
test2 = test;
test2 = [test2[0] -1 ,test2[1]];有没有人能解释一下为什么会这样。
谢谢你,TheLorax
发布于 2010-08-27 10:50:39
在Python语言中,就像在Java语言中一样,赋值本身并不会产生副本--相反,赋值会将另一个引用添加到与=右侧相同的对象中。(参数传递的工作方式与此相同)。奇怪的是,您从来没有听说过这个概念,而Python非常流行,而Java更是如此(许多其他语言也倾向于类似的工作方式,可能会有更复杂或更不同的地方)。
当你想要一个副本时,你需要一个副本(作为右边表达式的一部分,或者用来获取你传递的参数)!在Python语言中,根据您的确切目的,有几种方法--标准库的copy模块是一种流行的方法(使用函数copy,用于“浅层”复制,以及deepcopy --用于“深层”复制,当然,也就是说,不仅是容器,而且是每个包含的项,也会递归地进行深层复制)。
但是,您通常需要的是“新列表”--无论原始序列是列表、副本还是其他可迭代的内容,您可能并不关心:您想要一个新的list实例,它的项与“其他项”的项相同。表达这一点的完美方法是使用list(somethingelse) --调用list类型,它总是创建一个新的list实例,并将其作为参数提供给iterable,您希望在新的list中包含它的项。类似地,dict(somemapping)创建一个新的dict,set(someiterable)创建一个新的集合--调用一个类型来创建该类型的新实例是一个非常通用和有用的概念!
发布于 2010-08-27 10:28:46
这是因为当您执行test2 = test时,您并不是在复制列表的内容,而是简单地向test2分配一个对原始列表的引用。因此,对test2的任何更改也会影响test。
正确的方法是使用复制模块中的deepcopy() (如果可以进行浅层复制,则使用copy()。
import copy
test2 = copy.deepcopy(test) # deep copy
test2 = copy.copy(test)) # shallow copy
test2 = test[:] # shallow copy using slices有关更深入的解释以及复制列表的其他方法,请参阅this page。
发布于 2010-08-27 10:32:00
[1,2]是一个数组,当您将其赋值给test时,您将为该数组分配一个引用以进行测试。因此,当您执行test2=test时,您将引用赋值给另一个变量。对任何变量进行更改,数组都会被更改。
您的第二个示例可以工作,因为您完全创建了一个新数组。你可以像这样做:
test = [1,2]
test2 = [test[0]-1, test[1]]https://stackoverflow.com/questions/3580913
复制相似问题