首先让我们来看一个简单的C程序:
1 a = 8;2 b = a;3 b = 6;4 printf("a = %d, b = %d\n", a, b);
View Code
相信只要学过C语言, 不用运行程序便能知道程序将会打印出a = 8, b = 6.
现在让我们来看一看这个程序的python版本
1 a = 82 b = a3 b = 64 print(a, b)
View Code
让我们来看一看运行结果:
似乎一切都正常。
不,要是真的是那么简单,那要我干嘛!!!
看,程序又来了。。。
1 name = ['fujian', 'beijing', 'shanghai']2 name2 = name3 name2[1] = 'tainjing'4 print(name)5 print(name2)
python程序
结果是不是还是我们所想的那样:
['fujian', 'beijing', 'shanghai']
['fujian', 'tainjing', 'shanghai']
可现实是:
Why!Why!Why!
原因如下:
1. c语言中的变量好比一个盒子,a = 8就好比将8这个数据放入了这个名为a的盒子中;而python在这一方面与C语言可算是天壤之别;
python中的变量有点类似C语言中指针, a = 8在python中就好比a 指向了8这个数据.
2. python中的每一次赋值都是将变量指向一个新的的数据(位置)
现在我们在回过头来看一看这两个python程序,
一:
a = 8
b = a
b = 6
首先语句a = 8说明变量a指向了8这个数据;
接着语句a = b说明变量b指向了a,也就等同与a与b一起指向了8这个数据;
最后语句b = 6,说明此时变量b的指向已经发生了改变, 但是变量a的指向并没有改变,变量b现在指向了6这个数据,变量a还是指向原来的数据8;
所以最后会打印出a = 8, b = 6.
二:
name = ["fujian", "beijing", "shanghai"]
name2 = name
name2[1] = "tianjing"
同样我们可以类似上一个程序那样分析:
首先第一条语句说明变量name指向了一个列表;
第二条语句说明变量name2与name指向了同一个列表;
第三条语句的分析非常重要:
请注意
name[1]其实也可以看成是一个‘变量’,只不过这个变量是属于name所指向的列表的一部分,它原先是指向“beijing”这个字符串,
现在经过第三条语句后,变量name[1]就改变了指向,指向了“tianjing"这个字符串了;这样也恰好改变了列表中的内容。
再加上最终name与name2还是指向最初的那个列表(只不过这个列表‘更新’了),
所以现在问题不就解决了!!!