Python 变量、内存、动态语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liangxy2014/article/details/79311881

前言:
python 的数据类型有字符串、数字、列表、元组、字典

问题:
1.Python中,变量是可变,还是不可变类型?
2.如何判断是否是同一个对象

变量:

  • 变量名:必须是大小写英文、数字、_的组合,且不能使用数字开头。
  • 在Python中,不需要事先声明变量的类型,变量的类型和值再赋值的那一刻被初始化(声明和定义一起完成)
  • 在Python中,等号 =是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同的类型。
a = 111     # a是整数
print a
a = 'Good'  # a变为字符串
print a
  • 动态语言:python这种变量本身类型不固定的语言称之为动态语言。 与之对应的是静态语言,静态语言在定义变量时必须指定变量的类型,如果赋值时类型不匹配,就会报错。
    和静态语言相比,动态语言更灵活,原因来自于此。
# java
int a = 123; // a是整数类型变量
a = "ABC";   // 错误:不能把字符串赋给整型变量
  • 请不要把赋值语句的=等同于数学的等号。
x = 10
x = x + 9

从数学上理解 x = x + 9,无论如何不会成立,但在程序中,赋值语句从右向左计算,先计算右侧的表达式 x+2,得到12,再赋值给变量x。x的值,从10变为12

  • 最后理解下变量在计算机内存中的表示。
  • 当写a = 'ABC'时,Python解释器做了两件事,
    1.在内存中创建了一个’ABC’的字符串;
    2.在内存中创建了一个名为a的变量,并把它指向’ABC’
  • a = 'ABC'
    b = a
    a = 'XYZ'
    print(b)

    步骤详解:
    1.在内存中创建了一个’ABC’的字符串;
    2.把变量a赋值给变量b,实际上是把变量b指向变量a所指向的数据
    3.把一个新对象(XYZ)赋值给变量a
    4.打印b的值,依然是’ABC’

常量
所谓的常量,是指不能变的变量,比如数学常数π。
在Python中,通常用全部大写的变量名表示常量:

PI = 3.141592653

但事实上PI依然是一个变量,Python根本没有任何机制保证PI不会被改变。所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果一定要改变变量PI的值,也是可以的。

如何判断是否是同一个对象

判断是否是同一个对象,也可以理解为是否是同一块内存地址。
为了探索对象在内存的存储,可以求助于python的内置函数id()。它用于返回对象的身份(identity),所谓的身份,就是该对象的内存地址。

a = 1
b = 1
print id(a)         # 返回内存地址的十进制
print hex(id(a))    # 返回内存地址的十六进制
print id(b)
print hex(id(b))
print a is b        # is(身份运算符)用于判断两个引用所指的对象是否相同

第一次启动解释器,输出结果为:

5874392
0x59a2d8
5874392
0x59a2d8
True

a和b实际上是指向同一个对象的两个引用。

第二次启动解释器,输出结果为:

6333144
0x60a2d8
6333144
0x60a2d8
True

原因解释:

Python有个特别的机制,它会在解释器启动的时候事先分配好一些缓冲区,这些缓冲区部分是固定好取值,例如整数[-5,256]的内存地址是固定的(这里的固定指这一次程序启动之后,这些数字在这个程序中的内存地址就不变了,但是启动新的python程序,两次的内存地址不一样)。有的缓冲区就可以重复利用。这样的机制就使得不需要python频繁的调用内存malloc和free。

引用:
有关内容,参照以下链接:
http://blog.csdn.net/liweiblog/article/details/64128241
http://blog.csdn.net/weixin_38111819/article/details/79235943
作者:Vamei 出处:http://www.cnblogs.com/vamei

猜你喜欢

转载自blog.csdn.net/liangxy2014/article/details/79311881