一、引用变量
在大多数编程语言中,值的传递通常可以分为两种形式“值传递与引用(地址)传递”,但是在Python中变量的传递基本上都是引用(地址)传递。
变量在内存底层的存储形式
a = 10
第一步:首先在计算机内存中创建一个数值10(占用一块内存空间)
第二步:在栈空间中声明一个变量,如a
第三步:把数值10的内存地址赋予给变量小a,形成所谓的“引用关系”
如何验证Python中变量的引用关系
答:可以使用内置方法id(),其参数就是要显示的变量信息 => id(变量名称)
a = 10
print(id(a)) #140737082029128
把一个变量赋予给另外一个变量的影响
说明:由以上运行结果可知,当我们把一个变量赋予给另外一个变量时,其两者指向的内存地址相同。就说明a和b指向了同一块内存空间。
思考:如果在b = a以后,我们改变了变量a的值,问变量b是否会受到影响?
a = 10
b = a
print(a) # 10
print(b) # 10
a = 100
print(a) # 100
print(b) # 10
print(id(a)) # 140737082032008
print(id(b)) # 140737082029128
总结:不可变数据类型(数值)在赋值以后,其中一个值的改变不影响另外一个变量,因为两者指向空间地址不同。
二、Python中可变和非可变数据类型
在Python中一共有几种数据类型?
答:7种,数值(int整型、float浮点类型)、bool类型(True和False)、字符串类型(str)、元组(tuple 1,2,3)、列表(list [1, 2, 3])、字典(dict {key:value})、集合(set {1, 2})
在Python中,我们可以把7种数据类型分为两大类:可变类型 + 非可变类型
① 不可变类型(内存地址一旦固定,其值就不能发生改变)
数值(int整型、float浮点类型)
bool类型(True和False)
字符串类型(str)
元组(tuple 1,2,3)
② 可变类型(内存地址一旦固定,其值是可以发生改变)
列表(list [1, 2, 3])
字典(dict {key:value})
集合(set {1, 2})
如何判断一个数据类型是可变类型还是非可变类型?
在Python中,可变类型与非可变类型主要是通过这个数据类型在内存中的表现形式来进行定义的。
① 可变类型就是在内存中,其内存地址一旦固定,其变量的值是可以发生改变的
a = [1, 2, 3]
print(id(a)) # 1728632214720
# 向内存中追加新数据(对数据进行改变只能通过数据类型.方法()实现)
a.append(4)
print(id(a)) # 1728632214720
② 非可变类型就是在内存中,内存地址一旦固定,其变量的值就没办法发生任何改变了
a = 10
print(id(a)) # 140737370715208
a = 'hello'
print(id(a)) # 2245630382640
三、可变类型与非可变类型在函数中的应用
可变类型
# 定义一个函数
def func(names):
names.append('赵六')
# 定义一个全局变量
names = ['张三', '李四', '王五']
# 调用函数
func(names)
print(names) ['张三', '李四', '王五', '赵六']
综上所述:可变类型在函数中,如果在全局或局部中对可变类型进行增删改操作,其外部和内部都会受到影响。
不可变类型
# 定义一个函数
def func(num):
num += 1
print(num) # 11
# 定义一个全局变量
a = 10
# 调用函数
func(a)
# 在全局作用域中打印a
print(a) # 10
综上所述:不可变类型在函数中,局部或全局的改变对外部和内部都没有任何影响。
原文始发于微信公众号(Python之家):Python基础-17-变量的变与不变
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198501.html