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)
让我们来看一看运行结果:
似乎一切都正常。
不,要是真的是那么简单,那要我干嘛!!!
看,程序又来了。。。
name = ['fujian', 'beijing', 'shanghai']
name2 = name
name2[1] = 'tainjing'
print(name)
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还是指向最初的那个列表(只不过这个列表‘更新’了),
所以现在问题不就解决了!!!
如果您发现以上信息有问题,请及时留言,谢谢!
python中的赋值操作与C语言中的赋值操作中的巨大差别的更多相关文章
- 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作
原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...
- 【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
一.JQuery中样式的操作 1.给id=mover的div采用属性增加样式.one $("#b1").click(function(){ $("#mover" ...
- Java中Cookie常用操作类(Spring中操作Cookie)
说明:Cookie下用Key取值没有快速的方法,只能便利循环去取. 技巧:置0则cookie会立即删除,设置-1,负值则会在关闭浏览器后删除.切记一定要增加路径:setPath("/&quo ...
- Python中的切片操作
python中的切片操作功能十分强大,通常我们利用切片来进行提取信息,进行相关的操作,下面就是一些切片的列子. 列如我们从range函数1-100中取7的倍数,函数及结果如下所示: >>& ...
- GO语言中的几个关键思想
GO语言的设计理念与C++,Java,Python之流大相径庭. 一.没有函数重载 GO语言里面没有函数重载,Java.C#.C++三位大牛都是支持函数重载的,Python虽然不支持函数重载,但是支持 ...
- Go语言中的并发编程
并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天) ...
- C语言中的宏定义
目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的 ...
- OpenGL中位图的操作(glReadPixels,glDrawPixels等)
OpenGL中位图的操作 OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例). 1. BMP文件格式简单介绍 BMP文件是一种像素文件,它 ...
- C语言中函数和指针的參数传递
近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...
随机推荐
- EditPlus VC2010 and 2008 C/C++配置
源自:http://blog.csdn.net/weiling_shen/archive/2010/03/26/5421017.aspx 对于2010跟2008差不多,只需相应的修改一下路径即可:如2 ...
- HDU 1828:Picture(扫描线+线段树 矩形周长并)
题目链接 题意 给出n个矩形,求周长并. 思路 学了区间并,比较容易想到周长并. 我是对x方向和y方向分别做两次扫描线.应该记录一个pre变量,记录上一次扫描的时候的长度,对于每次遇到扫描线统计答案的 ...
- HDU 6181:Two Paths(A* + SPFA)
题目链接 题意 给出n个点m条边的无向图,求次短路. 思路 和 POJ 2449 类似,只不过大小要开成long long. #include <bits/stdc++.h> using ...
- 浅谈 JavaScript 中 Array 类型的方法使用
前言:Array 类型是 JavaScript 中除了 Object 类型以外最常用的类型. 一.创建数组 JavaScript 中的数组与其他语言中的数组有着很大的区别.例如Java.PHP等语言中 ...
- 用JAVA打印出棱形
public class Test { public static void main(String[] args) { //输入行数 print(5); } public static void p ...
- 使用http3访问服务
用到的包:import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response; 主要代码: try { //创建OkH ...
- Centos7 防护墙 设置端口
Centos7中的防火墙调整为firewalld,试一下systemctl stop firewalld关闭防火墙. 命令:systemctl stop firewalld 命令:systemctl ...
- 深度总结eMMC发展史 ICMAX值得更好地期待
随着大数据.云计算.物联网等产业的发展,信息存储安全一旦受到威胁,将危害到政军.石油.化工.核能.金融等所有行业的安全.存储芯片又被称为电子产品的“粮食”,占产品成本的二成左右,尽管中国是全球最大的手 ...
- Jenkins Ci系列目录
Jenkins入门篇 1.Jenkins入门之界面概览 2.Jenkins入门之新建任务 3.Jenkins入门之导航操作 4.Jenkins入门之任务基本操作 5.Jenkins入门之执行Power ...
- Devops-运维效率之数据迁移自动化
overmind系统上线三个月,累计执行任务800+,自动审核执行SQL超过5000条,效率提升相当明显,离"一杯咖啡,轻松运维"的目标又进了一步. 写在前边 overmind系统 ...