我是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
数据)。怎么不可能复制?
答案 0 :(得分: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
然后在第二行中,您将两个变量引用到内存中的相同数据结构。因此,当您使用其中一个修改此结构时,这些更改在两个变量中都可见。
答案 1 :(得分: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(s)相同。
如果您开始使用C或C ++编程,这个概念将难以理解。但是在python中尝试使用google搜索可变和不可变的变量。
答案 2 :(得分:1)
num1
和num2
因为单个类型的值在不同的内存部分中,所以它们的值独立一个。< / p>
当您使用赋值运算符=,
时,
列表(和其他复杂类型)使用引用,因此=
的左侧运算符获取正确的地址。
这意味着内存中只有一个列表,list1
和list2
共享此内存。