在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

我理解,由于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
不会更改
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类。复制模块的工作方式很有魅力。谢谢