本篇文章给大家谈谈python变量的值可以改变吗,以及python语言中的变量,希望对各位有所帮助,不要忘了收藏本站喔。
目录
前言
(Python3版本-小白专用)本次是Python中变量的理解,以及赋值的理解。比较详细,不喜勿喷用python如何画弧形。
一、python中的变量以及赋值的概念
变量名字 | 引用(指针) | 对象 |
---|---|---|
a | = | 1 |
- 对象的赋值,实际上是对 对象 的 引用,在创建一个对象并把他赋值给一个变量时,该变量 指向 该对象的 引用,其id() 的返回值保持一致,也就是内存地址是一样的。
a = 1 #名字为a的标签指向数据1
b = a #名字为b的标签也指向数据1
print(id(a),id(b)) #输出标签a与标签b的内存地址
'''
输出结果:
1484549152 1484549152
'''
-
在 python 中赋值语句总是建立对象的引用值,而不是复制对象。因此,python 变量更像是指针,而不是数据存储区域,这点和大多数 OO 语言类似吧,比如 C++、java 等。
-
Python 没有「变量」
我们平时所说的变量其实只是
「标签」,是引用。
-----------(便于理解,用实际例子去解释)------------
1、对象的引用
1.1 题目①: 求输出c的值是多少?
a = 1
c = a
a = 2
print(c)
- 以下画图来演示,他们的赋值过程(其实是引用(指针) 的过程)
1.1.1 a = 1
- 当a = 1时,一个名字为a的标签 “指向” 了数据1
1.1.2 c = a
- 当c = a时,一个名字为c的标签 也 “指向” 了数值1,此时共有两个名字不同的标签指向了数据1
- 此时,c标签与a标签的地址相同
1.1.3 a = 2
- 当a = 2时,这里是将新对象数据2 赋值 给 a标签,
也就是a “指向(引用)” 了 新数据2
a标签的地址改变了。 - 虽然 c = a ,c 指向了数据1,但是 a重新指向了一个新对象(新地址),即a改变不影响c的结果 ,因此最终print ( c ) 的结果,还是为 1
2.1 题目②: 求输出b的值是多少?
a = [1,2,3]
b = a
a[0] = 5
print(b)
- 以下画图来演示,他们的赋值过程(其实是引用(指针) 的过程)
2.1.1 a = [1,2,3]
- 当a = [1,2,3]时,一个名字为a的标签 “指向” 了数据[1,2,3]
2.1.2 b = a
- 当b = a时,一个名字为b的标签 “指向” 了数据[1,2,3]
- 此时,a标签和b标签的地址一样
2.1.3 a[0] = 5
- 当a[0] = 5时,把5赋值给a标签的第一个元素。
a标签还是指向列表[5,2,3]。b标签所指的对象(地址没有变,但是里面数据改变了一点) - 所以此时 print(b) 输出的结果是 [ 5,2,3 ]
(而不是[ 1,2,3 ])
以上都是引用对象(例如这里的b = a ),
那如果我想真的复制 这个对象,我该怎么做呢?
2、对象的浅拷贝
- 对象的“浅层复制”,有三种方法,分别是切片操作、对象实例化、copy模块的copy()函数
- 首先创建一个标签为b的序列 b=[ 1,2,3, [ 4,5 ] ]
即在序列 [1,2,3 ] 中 嵌套 一个序列 [ 4,5 ] - 浅拷贝(浅层复制)的意思是“复制时,其内部嵌套的序列无法复制”
2.1 切片操作
- a = b[ : ]
- 由于是“浅层复制”,所以序列 [ 4,5 ] 无法被复制 。
因此,标签b与标签a都指向同一个嵌套序列。
例题1
- (希望大家都做一下)
- 阅读下列Python语句,请问输出结果是什么?
names1 = ['Amy','Bob','Charlie','Daling']
names2 = names1
names3 = names1[:]
names2[0] = 'Alice'
names3[1] = 'Ben'
sum = 0
for ls in (names1,names2,names3):
if ls[0] == 'Alice':
sum += 1
if ls[1] == 'Ben':
sum += 2
print(sum)
小提示:此处注意引用与浅层复制
- 如果你算出 sum = 4 ,那么恭喜你,你已经懂了。
(不懂的,可以在评论区问小编哦)
2.2 对象实例化
- c = list( b )
2.3 copy模块的copy()函数
- d = copy.copy(b)
3、对象的深拷贝
- 如果要递归复制对象中包含子对象,可以用对象深层复制
3.1 copy模块中的deepcopy()函数
-
d = copy.deepcopy(b)
-
由于是“深层复制”,所以其内部嵌套的序列 [ 4,5 ] 也被复制 。
-
完全复制一个一模一样的!
-
深拷贝(深层复制)的意思是“复制时,连其内部嵌套的序列也一起复制”
二、回顾与思考
1、为什么题目①和题目②结果的形式不一样?
- 答:
题目①是
a = 1;c = a ;a = 2 ;print( c )
其中 a = 2只是把a标签指向的一个新的值。
所以c输出结果是 1 (而不是2)
题目②是
a = [1,2,3 ] ;b = a ;a[0] = 5 ;print(b)
其中 a[0] = 5 只是把a标签本身指向的对象[1,2,3]中的第一个数值1改变成5。因为b标签与a标签所指对象一样,所以b的输出结果也是[5,2,3] (而不是像题目①一样,还是等于起始a的值)
2、浅拷贝与深拷贝的区别是什么?
- 答:
区别是
深拷贝(深层复制)的意思是“复制时,连其内部嵌套的序列也一起复制”
浅拷贝(浅层复制)的意思是“复制时,其内部嵌套的序列 无法 复制”
三、总结
- 1、Python中变量,其实是一个 “标签”
- 2、对象的赋值,实际上是对 对象 的 引用(指针),在创建一个对象并把他赋值给一个变量时,该变量 指向 该对象的 引用,其id() 的返回值保持一致,也就是内存地址是一样的。
- 3、 深拷贝(深层复制)的意思是“复制时,连其内部嵌套的序列也一起复制”
- 4、 浅拷贝(浅层复制)的意思是“复制时,其内部嵌套的序列 无法 复制”
如果您还是不懂 或者 想了解的更全面,请点击此链接: 请点击我.