python中的赋值操作与C语言中的赋值操作中的巨大差别

时间:2023-03-09 06:01:52
python中的赋值操作与C语言中的赋值操作中的巨大差别

首先让我们来看一个简单的C程序:

 a = ;
b = a;
b = ;
printf("a = %d, b = %d\n", a, b);

相信只要学过C语言, 不用运行程序便能知道程序将会打印出a = 8,  b = 6.

现在让我们来看一看这个程序的python版本

 a = 8
b = a
b = 6
print(a, b)

让我们来看一看运行结果:

python中的赋值操作与C语言中的赋值操作中的巨大差别

似乎一切都正常。

不,要是真的是那么简单,那要我干嘛!!!

看,程序又来了。。。

 name = ['fujian', 'beijing', 'shanghai']
name2 = name
name2[1] = 'tainjing'
print(name)
print(name2)

python程序

结果是不是还是我们所想的那样:

['fujian', 'beijing', 'shanghai']

['fujian', 'tainjing', 'shanghai']

可现实是:

python中的赋值操作与C语言中的赋值操作中的巨大差别

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还是指向最初的那个列表(只不过这个列表‘更新’了),

    所以现在问题不就解决了!!!

    如果您发现以上信息有问题,请及时留言,谢谢!