python变量

变量小结

1.标识符的第一个字符必须是字母表中的字母(大写或者小写)或者一个下划线('_')。
2.标识符名称的其他部分可以由字母(大写或者小写)、下划线('_')或数字(0-9)组成。
3.标识符名称是对大小写敏感的。例如,myname 和myName不是一个标识符。
4.有效标识符名称的例子有 i、_my_name、name_23和a1b2_c3。
5.无效标识符名称的例子有 1things、this is spaced out 和 my-name。
 

变量关键字 

以下关键字不能声明为变量名

import keyword
print(keyword.kwlist)

输出结果:

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

 

变量命名习惯

1,以单一下划线开头变量名(_x)不会被 from module import 语句导入。
2,前后有下划线的变量名(_x_)是系统定义的变量名,对python解释器有特殊意义。
3,以两个下划线开头但结尾没有下划线的变量名(__x)是类的本地变量。
4,交互式模式下,变量名“ _ ” 用于保存最后表达式的结果。

 

变量名的命名风格

风格一:纯小写加下划线的方式

在python中,关于变量名的命名推荐使用这种方式

age_of_cat = 13

 

风格二:驼峰体

AgeOfCat = 13

 

变量的声明

1.一般申明

a = 100
b = 101
print(a)
print(b)

 

2.交叉赋值

a,b = 200,201
# print(值1,值2,值3, ..... ) 一行打印所有变量
print(a , b)

 

3.链式赋值

a = b = 300
print(a, b)

 

4.解压赋值

salaries = [111,222,333,444,555]
mon0,mon1,mon2,mon3,mon4 = salaries
print(mon0)
print(mon1)
print(mon2)
print(mon3)
print(mon4)

# mon0,mon1,mon2,mon3 = salaries  # 报错 对应的变量名少一个不行
# mon0,mon1,mon2,mon3,mon4,mon5 = salaries # 报错 对应的变量名多一个也不行

 

引入*,可以帮助我们取两头的值,无法取中间的值
取前三个值
*会将没有对应关系的值存成列表然后赋值给紧跟其后的那个变量名,此处为_

x,y,z,*_=salaries=[111,222,333,444,555] 
print(x,y,z)
print(_)

 

取后三个值

*_,x,y,z=salaries=[111,222,333,444,555]
print(x,y,z)

 

x,*_,y,z=salaries=[111,222,333,444,555]
print(x,y,z)

 

salaries=[111,222,333,444,555]
_,*middle,_=salaries
print(middle)

 

解压字典默认解压出来的是字典的key

x,y,z=dic={'a':1,'b':2,'c':3}
print(x,y,z)

 

变量值三个重要的特征

id:反映的是变量值的内存地址,内存地址不同id则不同
type:不同类型的值用来表示记录不同的状态
value:值本身

name = 'Oracle'
print(id(name))
print(type(name))
print(name)

输出结果:

2899336181040
<class 'str'>
Oracle

 

关于id和值的说明:

(1)id不同的情况下,值有可能相同,即两块不同的内存空间里可以存相同的值
(2)id相同的情况下,值一定相同,x is y成立,x == y也必然成立

>>> x='info:Wuxia:18'
>>> y='info:Wuxia:18'
>>> print(x,y)
info:Wuxia:18 info:Wuxia:18
>>> print(id(x),id(y))
4565819264 4566192176
>>> 
>>> 
>>> 
>>> x == y
True
>>> x is y
False

 

当下面的代码一起执行,和上面的结果不一样,因为代码编辑器 把预分配的范围扩大了。

var_x = 'info:Wuxia:18'
var_y = 'info:Wuxia:18'
print(var_x,var_y)
print(id(var_x),id(var_y))
print(var_x == var_y)
print(var_x is var_y)

输出结果:

Oracle
Oracle
2289306580336
2289306580336
True
True

 

is与==

is:比较左右两个值身份id是否相等
==:比较左右两个值他们的值是否相等

 

Python小整数池

从python解释器启动那一刻开始,就会在内存中事先申请好一系列内存空间存放好常用的整数。
小整数池其实就是一个指针数组,该数组的大小为262(257+5),
表示的小整数的范围为[-5,257)(包括-5,不包括257)

范例一:

m = 10
n = 10
print(id(m))
print(id(n))
res=4+6
print(res)
print(id(res))

输出结果:

140729229494208
140729229494208
10
140729229494208

 

范例二:

x = -5
y = -5
print(id(x))
print(id(y))
print(x is y)

输出结果:

140729373476320
140729373476320
True

 

范例三:

x = -6
y = -6
print(id(x))
print(id(y))
print(x is y)

输出结果:

3229128694512
3229128694512
True

-6不属于小整数池,出现上面的结果是因为代码编辑器 把预分配的范围扩大了。

 

范例四:

x = 'aaa'
y = 'aaa'
print(id(x))
print(id(y))

输出结果:

2338310665520
2338310665520

 

变量的交换

a = 18
b = 19

# 通用写法
tmp = a
a = b
b = tmp
print(a,b)

# python特有
a = 18
b = 19
a,b = b,a
print(a,b)

 

常量

永远不变的量(约定俗成:把每个字母都变成大写)

BIRTHDAY = "1010"
ID_CARD = 210205200010106688

 

一个变量赋值的例子

name1 = 'test1'
name2 = name1
print(name2)
name1 = 'test2'
print(name2)

输出结果:

test1
test1

可从上述输出看出,在改变name1变量时候,name2也不会变(值还是test1)。
说明name1和name2指向了不同的内存地址,可以用命令 id 验证之,如下:

name1 = 'test1'
print(id(name1))
name2 = name1
print(id(name2))
name1 = 'test2'
print(id(name1))

输出结果:

2351814381040
2351814381040
2351814381360

 

python的复制:深拷贝和浅拷贝的区别

(1)直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变

alist = [1,2,3,["a","b"]]
b = alist
print(b)
alist.append(5)
print(alist)
print(b)

输出结果:

[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]


(2)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变

alist = [1,2,3,["a","b"]]
import copy
c = copy.copy(alist)
print(alist)
print(c)

alist.append(5)
print(alist)
print(c)

print(alist[3])
alist[3].append('cccc')
print(alist)
print(c)

输出:

[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
['a', 'b']
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']]


(3)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

alist = [1,2,3,["a","b"]]
import copy
d = copy.deepcopy(alist)
print(alist)
print(d)

alist.append(5)
print(alist)
print(d)

print(alist[3])
alist[3].append("ccccc")
print(alist)
print(d)

输出结果:

[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
['a', 'b']
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']]

 

posted @ 2022-10-22 21:20  屠魔的少年  阅读(3)  评论(0)    收藏  举报