在python中如何按值赋值
我理解,由于Python的工作方式在python中如何按值赋值,python,arrays,list,Python,Arrays,List,我理解,由于Python的工作方式x=[];y=x;x、 追加(1);y将打印[1]。但是反过来说, z = [1,2] temp = z temp[1] = 3 z,temp 将打印([1,3],[1,3])。如果我理解正确,那么z和temp都指向同一个列表,因此更改其中一个会更改另一个,因为列表是可变的。我怎样才能防止这种情况发生?也就是说,我想创建一个for循环,它将z复制到temp,以不同的方式对其进行更改,并将其推送到队列中。要使其工作,z必须始终包含基本数组,因此我需要更改temp
x=[];y=x;x、 追加(1);y
将打印[1]
。但是反过来说,
z = [1,2]
temp = z
temp[1] = 3
z,temp
将打印([1,3],[1,3])
。如果我理解正确,那么z
和temp
都指向同一个列表,因此更改其中一个会更改另一个,因为列表是可变的。我怎样才能防止这种情况发生?也就是说,我想创建一个for循环,它将z
复制到temp
,以不同的方式对其进行更改,并将其推送到队列中。要使其工作,z
必须始终包含基本数组,因此我需要更改temp
不会更改z
编辑:我尝试将z更改为元组,以便
z=z,
,然后调用z[0]
,而不是z
。这仍然不能解决我的问题。复制列表很容易。。。只需切片即可:
temp = z[:]
这将创建一个浅拷贝——列表中元素的突变将显示在z
中的元素中,但不会直接更改为temp
出于更一般的目的,python有一个
copy
模块,您可以使用它:
temp = copy.copy(z)
或者,可能:
temp = copy.deepcopy(z)
为什么不把
temp
复制成z
:
>>> z = [1, 2]
>>> temp = z[:]
>>> temp[1] = 3
>>> z
[1, 2]
>>> temp
[1, 3]
>>>
[:]
轻松创建列表的浅层副本
但是,您可能还对和感兴趣,这两种类型都来自Python的模块。从技术上讲,Python只是按值传递-您看到的差异更多的是可变类型和不可变类型之间的差异。至于你的问题:你可以创建一个列表的副本,例如
newlist=oldlist[:]
。可能重复@miku No,可变性与赋值无关,只是创建另一个引用。在a=b
之后,a是b
始终为真,无论涉及何种类型。易变性所影响的唯一一件事就是它是多么容易被这个事实绊倒。在这个特定的例子中,我实际使用的是一个有3个列表的POD类。copy
模块工作起来就像一个符咒。谢谢。在这个特殊的例子中,我实际上在使用一个有3个列表的POD类。复制模块的工作方式很有魅力。谢谢