变量赋值

用字符串给变量赋值

 1 name1="我叫金三顺"
 2 name2=name1
 3 print ('name1 is : %s' % name1,'\nname2 is : %s ' % name2)
 4 name1="我叫金四顺"
 5 print ('name1 is : %s' % name1,'\nname2 is : %s ' % name2)
 6 name2="我叫金五顺"
 7 print ('name1 is : %s' % name1,'\nname2 is : %s ' % name2)
 8 print (id(name1))
 9 print (id(name2))
10 #字符串赋值。会对name2单独开放内存空间,所以修改name1不影响name2,修改name2也不会影响name1

下面是输出结果:

name1 is : 我叫金三顺
name2 is : 我叫金三顺
name1 is : 我叫金四顺
name2 is : 我叫金三顺
name1 is : 我叫金四顺
name2 is : 我叫金五顺
5094624
5094672

可见内存地址不一样。

下面再试试列表:

1 a=[1,2,4,5,6]
2 b=a
3 print ('lista is : %s' % a,'\nlistb is : %s ' % b)
4 a.append(9)
5 print ('lista is : %s' % a,'\nlistb is : %s ' % b)
6 b.append(100)
7 print ('lista is : %s' % a,'\nlistb is : %s ' % b)
8 print (id(a))
9 print (id(b))

输出结果:

lista is : [1, 2, 4, 5, 6]
listb is : [1, 2, 4, 5, 6]
lista is : [1, 2, 4, 5, 6, 9]
listb is : [1, 2, 4, 5, 6, 9]
lista is : [1, 2, 4, 5, 6, 9, 100]
listb is : [1, 2, 4, 5, 6, 9, 100]
2565984
2565984

可见内存地址一致。

得出结论:列表不会在单独分配内存空间。这一点和字符串不同。

至于为什么会有这种不同,天蓬元帅说:"

出于设计考虑字符串一般设置了后不会随便修改他的内容,但是列表字典会。
"
 
如果你用字典在上述实验,会发现字典和列表一样。
至此,本知识点结束。
 
顺便还学习了id函数:
id函数是返回对象object的标识符,标识符类型为整数,在同一个时间里所有对象的标识符是唯一的,如果在不同生命周期的对象有可能有相同的标识符。比如创建对象A之后,再删除A,再创建对象B,对象A与对象B可能有相同的标识符。在CPython里的实现算法是直接返回对象所在内存地址。