Python 中的赋值“=”行为? [重复]

问题描述 投票:0回答:3

我是Python(从C/C++)的完全初学者。 我几天来才在 python 上练习,当我观察下面几行的行为时,我很困惑。

#Integer case
num1 = 1
num2 = num1
print num1, num2
num1 += 1
print num1, num2

#List case
list1 = [1,2,3,4,5]
list2 = list1
print list1,list2
list1[2:2] = [0,0,0]
print list1, list2

这段代码给了我以下结果:

1 1
2 1
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
[1, 2, 0, 0, 0, 3, 4, 5] [1, 2, 0, 0, 0, 3, 4, 5]

这里,

num1
的值的变化并没有反映在
num2
中。但
list1
的变化反映在
list2
中。我对这种行为感到困惑,请澄清。 (我是初学者,非常感谢从初学者的角度进行解释。)

编辑:

以及如何获得

list1
的副本(无需实际创建引用)?

以我有

list1
(我需要在代码的后面部分保持不变)和
list2
为例,它除了“list1”之外还有其他数据(想要在
list1
数据上添加数据)。怎么可能复制?

python list mutable
3个回答
2
投票

数字、字符串和布尔值是 Python 中的原始类型。所以当你写的时候

num1 = 1
num2 = num1
print num1, num2
num1 += 1
print num1, num2

您会看到,您可以独立于 num2 修改 num1。

列表和其他复杂结构是参考。您可以想象该变量包含它们在内存中的地址。所以当你写的时候

list1 = [1,2,3,4,5]
list2 = list1
print list1,list2
list1[2:2] = [0,0,0]
print list1, list2

然后在第二行中让两个变量引用内存中的相同数据结构。因此,当您使用其中之一来修改此结构时,更改在两个变量中都是可见的。


2
投票

Python 变量可以分为两类:可变变量和不可变变量。了解他们。

为了简单解释,请考虑以下代码:

#Integer case
num1 = 1
num2 = num1

#List case
list1 = [1,2,3,4,5]
list2 = list1
list1[2:2] = [0,0,0]

print id(num2)
print id(num1)
print id(list1)
print id(list2)
num1 = 5
print id(num1)

示例输出如下:

33124696
33124696
139948056802008
139948056802008
33124600

发生的情况是,当您执行

num2=num1
时,会创建一个新变量,并且它指向
num1
值的位置。当
num1=5
执行时,
5
被存储在另一个新的内存空间中,并且
num1
现在指向它。

但列表中的情况并非如此。对于列表,将修改相同的内存空间以保持 id 相同。

如果您开始使用 C 或 C++ 进行编程,这个概念将很难理解。但是尝试用谷歌搜索 python 中的可变和不可变变量。


1
投票

num1
num2
作为单一类型,它们的值位于内存的不同部分,因此它们的值是相互独立的。

当您使用赋值运算符

=, 时,列表(和其他复杂类型)使用

引用
,因此
=
的左手运算符获得右侧运算符的 地址

这意味着内存中只有一个列表,并且

list1
list2
共享此内存

© www.soinside.com 2019 - 2024. All rights reserved.