我是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 中的原始类型。所以当你写的时候
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
然后在第二行中让两个变量引用内存中的相同数据结构。因此,当您使用其中之一来修改此结构时,更改在两个变量中都是可见的。
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 中的可变和不可变变量。
num1
和 num2
作为单一类型,它们的值位于内存的不同部分,因此它们的值是相互独立的。
当您使用赋值运算符 =,
时,列表(和其他复杂类型)使用
引用,因此
=
的左手运算符获得右侧运算符的 地址。
这意味着内存中只有一个列表,并且
list1
和list2
共享此内存。