Python3学习笔记:Python中的赋值操作

一、格式

变量 = 对象

二、简述

  • Python为动态解释性语言,在赋值操作时,并不需要像静态编译类型语言C、C++或Java一样,在使用变量前,需声明变量的类型。在Python中,类型是在运行过程中自动决定的,而不是通过代码声明。这意味着没有必要事先声明变量。
  • 变量和对象之间的关系为引用

三、解释

变量
  • 第一次赋值时,即创建它,之后赋值将会改变变量的值。
  • 变量名本身是没有类型的,类型只存在对象中,变量只是引用了对象而已。
  • 所有的变量,在使用前必须赋值,使用未赋值的变量会产生错误。
对象
  • 对象是有类型的
  • 对象是分配的一块内存空间,来表示它的值。
  • 每一个对象都具有两个标准的头部信息
    • 类型标志符,标识对象的类型
    • 引用计数器,用来决定对象是不是进行回收。
引用
  • 在Python中从变量到对象的连接称作引用。
  • 引用是一种关系,以内存中的指针的形式实现。
  • 赋值操作时,自动建立变量和对象之间的关系,即引用。

四、实例说明


1、简单引用
例一
a = 3

步骤说明:

  1. 创建一个对象来代表值3。
  2. 创建一个变量a,如果它还没有创建的话。
  3. 将变量与新的对象3相连接。

a = 3模型 :
Python3学习笔记:Python中的赋值操作_第1张图片

例二
a = 1
a = 'python'
a = 1.2
  • 这里的a,被多次赋值,并不是修改的对象,而是修改的引用,a指向1,然后修改引用指向’python’,最后指向1.2。
  • 1 和 ‘python’, 被放在内存空间内,在没有其他变量引用时,其引用计数为0,这个对象的内存空间就会自动回收。
  • 这里也并不是修改了a的类型,因为变量没有类型,只是它指向的对象具有类型,即对象头部信息的类型标志符。

2、共享引用
例一
a = 3
b = a

a 指向对象3; b = a,此赋值操作,b也指向3。

例一模型:
Python3学习笔记:Python中的赋值操作_第2张图片

例二
a = 3
b = a
a = 'spam'

a 重新指向另一个对象。

例二模型:
Python3学习笔记:Python中的赋值操作_第3张图片


3、== 和 is

== 指值相等
is 指地址相等,即指引用相等。

lst1 = [1, 2, 3]
lst2 = lst1
lst3 = [1, 2, 3]
print(lst1, lst2, lst3)
# 执行结果
[1, 2, 3] [1, 2, 3] [1, 2, 3]	# 值相等



lst2[0] = 10
print(lst1, lst2, lst3)
# 执行结果
[10, 2, 3] [10, 2, 3] [1, 2, 3]	# lst1和lst2发生变化
lst1 = [1, 2, 3]
lst2 = lst1
lst3 = [1, 2, 3]

print(lst1 == lst2)
print(lst1 is lst2)
print(lst1 == lst3)
print(lst1 is lst3)

# 执行结果
True
True
True
False

说明,lst1和lst2指向同一个对象。而lst3则执行另一个对象。两个对象只是值相等。

特殊情况
a = 1
b = a
c = 1

print(a == b)
print(a is b)
print(a == c)
print(a is c)
# 执行结果
True
True
True
True

这里a、b、c都指向同一个对象。
这是因为小的整数和字符串被缓存并复用了,所以is指明a和c是引用了一个相同的对象。

例如

a = 1
a = 'python'

这里的 1 并没有被直接回收,虽然它的计数减一,但是在系统代码中却被大量引用。查看引用计数如下

import sys

print(sys.getrefcount(1))
# 执行结果
4013

五、总结

  • 变量是一个系统表的元素,拥有指向对象的连接的空间。
  • 对象是分配的一块内存,有足够的空间去表示它们所代表的值。
  • 引用是自动形成的从变量到对象的指针。

注: 知识点参考了<>

你可能感兴趣的:(Python3学习笔记)