Python对象与变量

Python对象可分为可变对象和不可变对象。常见的可变对象包括:列表(list),字典(dict),集合(set)。常见的不可变对象包括:整型(int),字符串(string),元组(tuple)。

变量是对象的引用,对于习惯了C语言的小伙伴们来说,这句话听起来挺奇怪的。但Python有它自己的思考,不妨先搁下C语言,来研究Python的逻辑。

Python中的对象可以看作是CPU中的存储信息的内存块。它相应的引用,也就是变量,可以认为是对象的“标签”,“代言人”。我们通过直接处理变量,达到间接处理对应的对象的目的。




以下的Python语句:

x = [1, 2, 3, 4, 5]

看起来变量x是一个列表,实际上x是列表[1, 2, 3, 4, 5]的引用。

变量有种特点:“嫁鸡随鸡,嫁狗随狗”。比如上面的变量x,是列表(可变对象)的引用,那么就它就遵守列表的规矩,可以修改列表自身的值。如果修改列表[1, 2, 3, 4, 5]中的某个值,x也照样是该对象的引用。(Python可通过id()函数,查看变量引用的对象)

x = [1, 2, 3, 4, 5]
print(id(x))
x[0] = 6
print(id(x))

结果两次打印信息一样:

1704490653832
1704490653832

如果使用列表支持的.append()、.sort()、.insert()方法也是同样效果,不会让变量x成为别的对象的引用。
但如果重新赋值变量x,变量x就是新对象的引用了。

x = [2, 3, 4, 5, 6]
print(id(x))
1704490653768




那假如变量x是不可变对象的引用呢?
列表对象作为一种可变对象,允许在它自身进行操作,而不改变它的id信息。但不可变对象并没有这种权利,可以修改自身后还不改变id信息。后者修改后产生了新对象,当然前者也存在一些操作可以产生新对象。

x = 'p y t h o n'
print(id(x))
print(id(x.split()))
print(id(x))
print(x)
print(x.split())
1704491467568
1704491469320
1704491467568
p y t h o n
['p', 'y', 't', 'h', 'o', 'n']

这里以一类不可变对象:string对象为例,使用.split()函数会产生新的对象(id值变了)。
也许小伙伴们会觉得string.split()方法会产生一个list对象,显然不一样。那我们换用string.capitalize(),它的功能是把字符串的首字母大写,依然是string对象。

x = 'python' 
print(id(x)) # 查看当前变量x对应的string对象的id信息
print(id(x.capitalize())) # 执行string.capitalize方法后的结果的id信息,id信息改变说明产生了新对象
print(id(x)) # 查看当前变量x对应的string对象的id信息,发现没有改变,说明仍是原先的对象
print(x) # 查看原先对象的值是否发生改变,同样也没有改变。
print(x.capitalize()) # 查看string.capitalize()方法产生的对象的值

由程序和输出综合得知:对于与变量x对应的string对象而言,执行.capitalize()方法,产生了新对象,但变量x并没有指向新对象,仍是原对象的引用,并且原对象的值也没有发生改变。

1704461237864
1704491399632
1704461237864
python
Python

string对象的capitalize()方法并不会改变当前变量x的指向,但这不代表其他修改不会导致变量x指向别处。

x = 'python'
print(id(x))
x = 'java'
print(id(x))
print(x)
1704461237864
1704426538296
java

这里变量x成为了string对象’java’的引用。


Python对象支持许许多多的操作,无论是可变对象还是不可变对象,相较于C语言中的变量来说,都是很复杂的系统。

对于可变对象来说,通过与之对应的变量执行某些操作,虽然它们变化了,但它们仍是它们自己(id信息不会变)。就像我们自己头发变长变短,并不能说我们就不再是自己。当然也存在一些操作(比如赋值),会令原先与之对应的变量成为别的对象的引用。

对于不可变对象来说,它们比较倔强,每一个值都无法改变。如果想让某个变量指向的对象的值发生改变,只有让该变量成为新的对象的引用。有的操作选择保持该变量的指向不变,通过创建新的变量来指向新的对象,当然在这种情况下,假如没有创建新的变量,那么这个新的对象就不会被保存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值