python变量的值可以改变吗,python语言中的变量

本篇文章给大家谈谈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时,一个名字为a标签 “指向” 了数据1
1.1.2 c = a

c = a

  • 当c = a时,一个名字为c标签“指向” 了数值1,此时共有两个名字不同的标签指向了数据1
  • 此时,c标签与a标签的地址相同
1.1.3 a = 2

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]时,一个名字为a标签 “指向” 了数据[1,2,3]
2.1.2 b = a

b = a

  • 当b = a时,一个名字为b标签 “指向” 了数据[1,2,3]
  • 此时,a标签和b标签的地址一样
2.1.3 a[0] = 5

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 ]
  • 浅拷贝(浅层复制)的意思是“复制时,其内部嵌套的序列无法复制”
    b=[ 1,2,3, [ 4,5 ] ]
2.1 切片操作
  • a = b[ : ]

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 )

c = list( b )

2.3 copy模块的copy()函数
  • d = copy.copy(b)
    d = copy.copy(b)

3、对象的深拷贝

  • 如果要递归复制对象中包含子对象,可以用对象深层复制
3.1 copy模块中的deepcopy()函数
  • d = copy.deepcopy(b)
    d = copy.copy(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、 浅拷贝(浅层复制)的意思是“复制时,其内部嵌套的序列 无法 复制”

如果您还是不懂 或者 想了解的更全面,请点击此链接: 请点击我.

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值