python中的赋值“=”行为?

时间:2017-05-11 06:42:09

标签: python python-2.7

我是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数据)。怎么不可能复制?

3 个答案:

答案 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)

num1num2因为单个类型的值在不同的内存部分中,所以它们的值独立一个。< / p> 当您使用赋值运算符=,时,

列表(和其他复杂类型)使用引用,因此=的左侧运算符获取正确的地址

这意味着内存中只有一个列表,list1list2 共享此内存